git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Pdf.Content.Objects / CObjects.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
5 //\r
6 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
7 //\r
8 // http://www.pdfsharp.com\r
9 // http://sourceforge.net/projects/pdfsharp\r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining a\r
12 // copy of this software and associated documentation files (the "Software"),\r
13 // to deal in the Software without restriction, including without limitation\r
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
15 // and/or sell copies of the Software, and to permit persons to whom the\r
16 // Software is furnished to do so, subject to the following conditions:\r
17 //\r
18 // The above copyright notice and this permission notice shall be included\r
19 // in all copies or substantial portions of the Software.\r
20 //\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
27 // DEALINGS IN THE SOFTWARE.\r
28 #endregion\r
29 \r
30 using System;\r
31 using System.Collections.Generic;\r
32 using System.Diagnostics;\r
33 using System.Collections;\r
34 using System.Globalization;\r
35 using System.IO;\r
36 using System.Text;\r
37 using PdfSharp.Pdf.Internal;\r
38 \r
39 namespace PdfSharp.Pdf.Content.Objects  // TODO: split into single files\r
40 {\r
41   /// <summary>\r
42   /// Base class for all PDF content stream objects.\r
43   /// </summary>\r
44   public abstract class CObject : ICloneable\r
45   {\r
46     /// <summary>\r
47     /// Initializes a new instance of the <see cref="CObject"/> class.\r
48     /// </summary>\r
49     protected CObject()\r
50     {\r
51     }\r
52 \r
53     /// <summary>\r
54     /// Creates a new object that is a copy of the current instance.\r
55     /// </summary>\r
56     object ICloneable.Clone()\r
57     {\r
58       return Copy();\r
59     }\r
60 \r
61     /// <summary>\r
62     /// Creates a new object that is a copy of the current instance.\r
63     /// </summary>\r
64     public CObject Clone()\r
65     {\r
66       return (CObject)Copy();\r
67     }\r
68 \r
69     /// <summary>\r
70     /// Implements the copy mechanism. Must be overridden in derived classes.\r
71     /// </summary>\r
72     protected virtual CObject Copy()\r
73     {\r
74       return (CObject)MemberwiseClone();\r
75     }\r
76 \r
77     /// <summary>\r
78     /// \r
79     /// </summary>\r
80     internal abstract void WriteObject(ContentWriter writer);\r
81   }\r
82 \r
83   /// <summary>\r
84   /// Represents a comment in a PDF content stream.\r
85   /// </summary>\r
86   [DebuggerDisplay("({Text})")]\r
87   public class CComment : CObject\r
88   {\r
89     /// <summary>\r
90     /// Creates a new object that is a copy of the current instance.\r
91     /// </summary>\r
92     public new CComment Clone()\r
93     {\r
94       return (CComment)Copy();\r
95     }\r
96 \r
97     /// <summary>\r
98     /// Implements the copy mechanism of this class.\r
99     /// </summary>\r
100     protected override CObject Copy()\r
101     {\r
102       CObject obj = base.Copy();\r
103       return obj;\r
104     }\r
105 \r
106     /// <summary>\r
107     /// Gets or sets the comment text.\r
108     /// </summary>\r
109     public string Text\r
110     {\r
111       get { return this.text; }\r
112       set { this.text = value; }\r
113     }\r
114     string text;\r
115 \r
116     /// <summary>\r
117     /// Returns a string that represents the current comment.\r
118     /// </summary>\r
119     public override string ToString()\r
120     {\r
121       return "% " + this.text;\r
122     }\r
123 \r
124     internal override void WriteObject(ContentWriter writer)\r
125     {\r
126       writer.WriteLineRaw(ToString());\r
127     }\r
128   }\r
129 \r
130   /// <summary>\r
131   /// Represents a sequence of objects in a PDF content stream.\r
132   /// </summary>\r
133   [DebuggerDisplay("(count={Count})")]\r
134   public class CSequence : CObject, IList<CObject>, ICollection<CObject>, IEnumerable<CObject>\r
135   {\r
136     List<CObject> items = new List<CObject>();\r
137 \r
138     /// <summary>\r
139     /// Creates a new object that is a copy of the current instance.\r
140     /// </summary>\r
141     public new CSequence Clone()\r
142     {\r
143       return (CSequence)Copy();\r
144     }\r
145 \r
146     /// <summary>\r
147     /// Implements the copy mechanism of this class.\r
148     /// </summary>\r
149     protected override CObject Copy()\r
150     {\r
151       CObject obj = base.Copy();\r
152       this.items = new List<CObject>(this.items);\r
153       for (int idx = 0; idx < this.items.Count; idx++)\r
154         this.items[idx] = this.items[idx].Clone();\r
155       return obj;\r
156     }\r
157 \r
158     /// <summary>\r
159     /// Adds the specified sequence.\r
160     /// </summary>\r
161     /// <param name="sequence">The sequence.</param>\r
162     public void Add(CSequence sequence)\r
163     {\r
164       int count = sequence.Count;\r
165       for (int idx = 0; idx < count; idx++)\r
166         this.items.Add(sequence[idx]);\r
167     }\r
168 \r
169     #region IList Members\r
170 \r
171     /// <summary>\r
172     /// Adds the specified value add the end of the sequence.\r
173     /// </summary>\r
174     public void Add(CObject value)\r
175     {\r
176       this.items.Add(value);\r
177     }\r
178 \r
179     /// <summary>\r
180     /// Removes all elements from the sequence.\r
181     /// </summary>\r
182     public void Clear()\r
183     {\r
184       this.items.Clear();\r
185     }\r
186 \r
187     //bool IList.Contains(object value)\r
188     //{\r
189     //  return this.items.Contains(value);\r
190     //}\r
191 \r
192     /// <summary>\r
193     /// Determines whether the specified value is in the sequence.\r
194     /// </summary>\r
195     public bool Contains(CObject value)\r
196     {\r
197       return this.items.Contains(value);\r
198     }\r
199 \r
200     /// <summary>\r
201     /// Returns the index of the specified value in the sequence or -1, if no such value is in the sequence.\r
202     /// </summary>\r
203     public int IndexOf(CObject value)\r
204     {\r
205       return this.items.IndexOf(value);\r
206     }\r
207 \r
208     /// <summary>\r
209     /// Inserts the specified value in the sequence.\r
210     /// </summary>\r
211     public void Insert(int index, CObject value)\r
212     {\r
213       this.items.Insert(index, value);\r
214     }\r
215 \r
216     /////// <summary>\r
217     /////// Gets a value indicating whether the sequence has a fixed size.\r
218     /////// </summary>\r
219     ////public bool IsFixedSize\r
220     ////{\r
221     ////  get { return this.items.IsFixedSize; }\r
222     ////}\r
223 \r
224     /////// <summary>\r
225     /////// Gets a value indicating whether the sequence is read-only.\r
226     /////// </summary>\r
227     ////public bool IsReadOnly\r
228     ////{\r
229     ////  get { return this.items.IsReadOnly; }\r
230     ////}\r
231 \r
232     /// <summary>\r
233     /// Removes the specified value from the sequence.\r
234     /// </summary>\r
235     public bool Remove(CObject value)\r
236     {\r
237       return this.items.Remove(value);\r
238     }\r
239 \r
240     /// <summary>\r
241     /// Removes the value at the specified index from the sequence.\r
242     /// </summary>\r
243     public void RemoveAt(int index)\r
244     {\r
245       this.items.RemoveAt(index);\r
246     }\r
247 \r
248     /// <summary>\r
249     /// Gets or sets a CObject at the specified index.\r
250     /// </summary>\r
251     /// <value></value>\r
252     public CObject this[int index]\r
253     {\r
254       get { return (CObject)this.items[index]; }\r
255       set { this.items[index] = value; }\r
256     }\r
257     #endregion\r
258 \r
259     #region ICollection Members\r
260 \r
261     /// <summary>\r
262     /// Copies the elements of the sequence to the specified array.\r
263     /// </summary>\r
264     public void CopyTo(CObject[] array, int index)\r
265     {\r
266       this.items.CopyTo(array, index);\r
267     }\r
268 \r
269 \r
270     /// <summary>\r
271     /// Gets the number of elements contained in the sequence.\r
272     /// </summary>\r
273     public int Count\r
274     {\r
275       get { return this.items.Count; }\r
276     }\r
277 \r
278     ///// <summary>\r
279     ///// Gets a value indicating whether access to the sequence is synchronized (thread safe).\r
280     ///// </summary>\r
281     //public bool IsSynchronized\r
282     //{\r
283     //  get { return this.items.IsSynchronized; }\r
284     //}\r
285 \r
286     ///// <summary>\r
287     ///// Gets an object that can be used to synchronize access to the sequence.\r
288     ///// </summary>\r
289     //public object SyncRoot\r
290     //{\r
291     //  get { return this.items.SyncRoot; }\r
292     //}\r
293 \r
294     #endregion\r
295 \r
296     #region IEnumerable Members\r
297 \r
298     /// <summary>\r
299     /// Returns an enumerator that iterates through the sequence.\r
300     /// </summary>\r
301     public IEnumerator<CObject> GetEnumerator()\r
302     {\r
303       return this.items.GetEnumerator();\r
304     }\r
305 \r
306     #endregion\r
307 \r
308     /// <summary>\r
309     /// Converts the sequence to a PDF content stream.\r
310     /// </summary>\r
311     public byte[] ToContent()\r
312     {\r
313       Stream stream = new MemoryStream();\r
314       ContentWriter writer = new ContentWriter(stream);\r
315       WriteObject(writer);\r
316       writer.Close(false);\r
317 \r
318       stream.Position = 0;\r
319       int count = (int)stream.Length;\r
320       byte[] bytes = new byte[count];\r
321       stream.Read(bytes, 0, count);\r
322       stream.Close();\r
323       return bytes;\r
324     }\r
325 \r
326     /// <summary>\r
327     /// Returns a string containing all elements of the sequence.\r
328     /// </summary>\r
329     public override string ToString()\r
330     {\r
331       StringBuilder s = new StringBuilder();\r
332 \r
333       for (int idx = 0; idx < this.items.Count; idx++)\r
334         s.Append(this.items[idx].ToString());\r
335 \r
336       return s.ToString();\r
337     }\r
338 \r
339     IEnumerator IEnumerable.GetEnumerator()\r
340     {\r
341       return GetEnumerator();\r
342     }\r
343 \r
344     internal override void WriteObject(ContentWriter writer)\r
345     {\r
346       for (int idx = 0; idx < this.items.Count; idx++)\r
347         (this.items[idx] as CObject).WriteObject(writer);\r
348     }\r
349 \r
350     #region IList<CObject> Members\r
351 \r
352     int IList<CObject>.IndexOf(CObject item)\r
353     {\r
354       throw new NotImplementedException();\r
355     }\r
356 \r
357     void IList<CObject>.Insert(int index, CObject item)\r
358     {\r
359       throw new NotImplementedException();\r
360     }\r
361 \r
362     void IList<CObject>.RemoveAt(int index)\r
363     {\r
364       throw new NotImplementedException();\r
365     }\r
366 \r
367     CObject IList<CObject>.this[int index]\r
368     {\r
369       get\r
370       {\r
371         throw new NotImplementedException();\r
372       }\r
373       set\r
374       {\r
375         throw new NotImplementedException();\r
376       }\r
377     }\r
378 \r
379     #endregion\r
380 \r
381     #region ICollection<CObject> Members\r
382 \r
383     void ICollection<CObject>.Add(CObject item)\r
384     {\r
385       throw new NotImplementedException();\r
386     }\r
387 \r
388     void ICollection<CObject>.Clear()\r
389     {\r
390       throw new NotImplementedException();\r
391     }\r
392 \r
393     bool ICollection<CObject>.Contains(CObject item)\r
394     {\r
395       throw new NotImplementedException();\r
396     }\r
397 \r
398     void ICollection<CObject>.CopyTo(CObject[] array, int arrayIndex)\r
399     {\r
400       throw new NotImplementedException();\r
401     }\r
402 \r
403     int ICollection<CObject>.Count\r
404     {\r
405       get { throw new NotImplementedException(); }\r
406     }\r
407 \r
408     bool ICollection<CObject>.IsReadOnly\r
409     {\r
410       get { throw new NotImplementedException(); }\r
411     }\r
412 \r
413     bool ICollection<CObject>.Remove(CObject item)\r
414     {\r
415       throw new NotImplementedException();\r
416     }\r
417 \r
418     #endregion\r
419 \r
420     #region IEnumerable<CObject> Members\r
421 \r
422     IEnumerator<CObject> IEnumerable<CObject>.GetEnumerator()\r
423     {\r
424       throw new NotImplementedException();\r
425     }\r
426 \r
427     #endregion\r
428   }\r
429 \r
430   /// <summary>\r
431   /// Represents the base class for numerical objects in a PDF content stream.\r
432   /// </summary>\r
433   public abstract class CNumber : CObject\r
434   {\r
435     /// <summary>\r
436     /// Creates a new object that is a copy of the current instance.\r
437     /// </summary>\r
438     public new CNumber Clone()\r
439     {\r
440       return (CNumber)Copy();\r
441     }\r
442 \r
443     /// <summary>\r
444     /// Implements the copy mechanism of this class.\r
445     /// </summary>\r
446     protected override CObject Copy()\r
447     {\r
448       CObject obj = base.Copy();\r
449       return obj;\r
450     }\r
451 \r
452     //internal override void WriteObject(ContentWriter writer)\r
453     //{\r
454     //  throw new Exception("Must not come here.");\r
455     //}\r
456   }\r
457 \r
458   /// <summary>\r
459   /// Represents an integer value in a PDF content stream.\r
460   /// </summary>\r
461   [DebuggerDisplay("({Value})")]\r
462   public class CInteger : CNumber\r
463   {\r
464     /// <summary>\r
465     /// Creates a new object that is a copy of the current instance.\r
466     /// </summary>\r
467     public new CInteger Clone()\r
468     {\r
469       return (CInteger)Copy();\r
470     }\r
471 \r
472     /// <summary>\r
473     /// Implements the copy mechanism of this class.\r
474     /// </summary>\r
475     protected override CObject Copy()\r
476     {\r
477       CObject obj = base.Copy();\r
478       return obj;\r
479     }\r
480 \r
481     /// <summary>\r
482     /// Gets or sets the value.\r
483     /// </summary>\r
484     public int Value\r
485     {\r
486       get { return this.value; }\r
487       set { this.value = value; }\r
488     }\r
489     int value;\r
490 \r
491     /// <summary>\r
492     /// Returns a string that represents the current value.\r
493     /// </summary>\r
494     public override string ToString()\r
495     {\r
496       return this.value.ToString(CultureInfo.InvariantCulture);\r
497     }\r
498 \r
499     internal override void WriteObject(ContentWriter writer)\r
500     {\r
501       writer.WriteRaw(ToString() + " ");\r
502     }\r
503   }\r
504 \r
505   /// <summary>\r
506   /// Represents a real value in a PDF content stream.\r
507   /// </summary>\r
508   [DebuggerDisplay("({Value})")]\r
509   public class CReal : CNumber\r
510   {\r
511     /// <summary>\r
512     /// Creates a new object that is a copy of the current instance.\r
513     /// </summary>\r
514     public new CReal Clone()\r
515     {\r
516       return (CReal)Copy();\r
517     }\r
518 \r
519     /// <summary>\r
520     /// Implements the copy mechanism of this class.\r
521     /// </summary>\r
522     protected override CObject Copy()\r
523     {\r
524       CObject obj = base.Copy();\r
525       return obj;\r
526     }\r
527 \r
528     /// <summary>\r
529     /// Gets or sets the value.\r
530     /// </summary>\r
531     public double Value\r
532     {\r
533       get { return this.value; }\r
534       set { this.value = value; }\r
535     }\r
536     double value;\r
537 \r
538     /// <summary>\r
539     /// Returns a string that represents the current value.\r
540     /// </summary>\r
541     public override string ToString()\r
542     {\r
543       return this.value.ToString(CultureInfo.InvariantCulture);\r
544     }\r
545 \r
546     internal override void WriteObject(ContentWriter writer)\r
547     {\r
548       writer.WriteRaw(ToString() + " ");\r
549     }\r
550   }\r
551 \r
552   /// <summary>\r
553   /// Represents a string value in a PDF content stream.\r
554   /// </summary>\r
555   [DebuggerDisplay("({Value})")]\r
556   public class CString : CObject\r
557   {\r
558     /// <summary>\r
559     /// Creates a new object that is a copy of the current instance.\r
560     /// </summary>\r
561     public new CString Clone()\r
562     {\r
563       return (CString)Copy();\r
564     }\r
565 \r
566     /// <summary>\r
567     /// Implements the copy mechanism of this class.\r
568     /// </summary>\r
569     protected override CObject Copy()\r
570     {\r
571       CObject obj = base.Copy();\r
572       return obj;\r
573     }\r
574 \r
575     /// <summary>\r
576     /// Gets or sets the value.\r
577     /// </summary>\r
578     public string Value\r
579     {\r
580       get { return this.value; }\r
581       set { this.value = value; }\r
582     }\r
583     string value;\r
584 \r
585     /// <summary>\r
586     /// Returns a string that represents the current value.\r
587     /// </summary>\r
588     public override string ToString()\r
589     {\r
590       StringBuilder s = new StringBuilder("(");\r
591       int length = this.value.Length;\r
592       for (int ich = 0; ich < length; ich++)\r
593       {\r
594         char ch = this.value[ich];\r
595         switch (ch)\r
596         {\r
597           case Chars.LF:\r
598             s.Append("\\n");\r
599             break;\r
600 \r
601           case Chars.CR:\r
602             s.Append("\\r");\r
603             break;\r
604 \r
605           case Chars.HT:\r
606             s.Append("\\t");\r
607             break;\r
608 \r
609           case Chars.BS:\r
610             s.Append("\\b");\r
611             break;\r
612 \r
613           case Chars.FF:\r
614             s.Append("\\f");\r
615             break;\r
616 \r
617           case Chars.ParenLeft:\r
618             s.Append("\\(");\r
619             break;\r
620 \r
621           case Chars.ParenRight:\r
622             s.Append("\\)");\r
623             break;\r
624 \r
625           case Chars.BackSlash:\r
626             s.Append("\\\\");\r
627             break;\r
628 \r
629           default:\r
630 #if true_\r
631             // not absolut necessary to use octal encoding for characters less than blank\r
632             if (ch < ' ')\r
633             {\r
634               s.Append("\\");\r
635               s.Append((char)(((ch >> 6) & 7) + '0'));\r
636               s.Append((char)(((ch >> 3) & 7) + '0'));\r
637               s.Append((char)((ch & 7) + '0'));\r
638             }\r
639             else\r
640 #endif\r
641             s.Append(ch);\r
642             break;\r
643         }\r
644       }\r
645       s.Append(')');\r
646       return s.ToString();\r
647     }\r
648 \r
649     internal override void WriteObject(ContentWriter writer)\r
650     {\r
651       writer.WriteRaw(ToString());\r
652     }\r
653   }\r
654 \r
655   /// <summary>\r
656   /// Represents a name in a PDF content stream.\r
657   /// </summary>\r
658   [DebuggerDisplay("({Name})")]\r
659   public class CName : CObject\r
660   {\r
661     /// <summary>\r
662     /// Initializes a new instance of the <see cref="CName"/> class.\r
663     /// </summary>\r
664     public CName()\r
665     {\r
666       this.name = "/";\r
667     }\r
668 \r
669     /// <summary>\r
670     /// Initializes a new instance of the <see cref="CName"/> class.\r
671     /// </summary>\r
672     /// <param name="name">The name.</param>\r
673     public CName(string name)\r
674     {\r
675       Name = name;\r
676     }\r
677 \r
678     /// <summary>\r
679     /// Creates a new object that is a copy of the current instance.\r
680     /// </summary>\r
681     public new CName Clone()\r
682     {\r
683       return (CName)Copy();\r
684     }\r
685 \r
686     /// <summary>\r
687     /// Implements the copy mechanism of this class.\r
688     /// </summary>\r
689     protected override CObject Copy()\r
690     {\r
691       CObject obj = base.Copy();\r
692       return obj;\r
693     }\r
694 \r
695     /// <summary>\r
696     /// Gets or sets the name. Names must start with a slash.\r
697     /// </summary>\r
698     public string Name\r
699     {\r
700       get { return this.name; }\r
701       set\r
702       {\r
703         if (name == null || name.Length == 0)\r
704           throw new ArgumentNullException("name");\r
705         if (name[0] != '/')\r
706           throw new ArgumentException(PSSR.NameMustStartWithSlash);\r
707         this.name = value;\r
708       }\r
709     }\r
710     string name;\r
711 \r
712     /// <summary>\r
713     /// Returns a string that represents the current value.\r
714     /// </summary>\r
715     public override string ToString()\r
716     {\r
717       return this.name;\r
718     }\r
719 \r
720     internal override void WriteObject(ContentWriter writer)\r
721     {\r
722       writer.WriteRaw(ToString() + " ");\r
723     }\r
724   }\r
725 \r
726   /// <summary>\r
727   /// Represents an array of objects in a PDF content stream.\r
728   /// </summary>\r
729   [DebuggerDisplay("(count={Count})")]\r
730   public class CArray : CSequence\r
731   {\r
732     /// <summary>\r
733     /// Creates a new object that is a copy of the current instance.\r
734     /// </summary>\r
735     public new CArray Clone()\r
736     {\r
737       return (CArray)Copy();\r
738     }\r
739 \r
740     /// <summary>\r
741     /// Implements the copy mechanism of this class.\r
742     /// </summary>\r
743     protected override CObject Copy()\r
744     {\r
745       CObject obj = base.Copy();\r
746       return obj;\r
747     }\r
748 \r
749     /// <summary>\r
750     /// Returns a string that represents the current value.\r
751     /// </summary>\r
752     public override string ToString()\r
753     {\r
754       return "[" + base.ToString() + "]";\r
755     }\r
756 \r
757     internal override void WriteObject(ContentWriter writer)\r
758     {\r
759       writer.WriteRaw(ToString());\r
760     }\r
761   }\r
762 \r
763   /// <summary>\r
764   /// Represents an operator a PDF content stream.\r
765   /// </summary>\r
766   [DebuggerDisplay("({Name}, operands={Operands.Count})")]\r
767   public class COperator : CObject\r
768   {\r
769     /// <summary>\r
770     /// Initializes a new instance of the <see cref="COperator"/> class.\r
771     /// </summary>\r
772     protected COperator()\r
773     {\r
774     }\r
775 \r
776     internal COperator(OpCode opcode)\r
777     {\r
778       this.opcode = opcode;\r
779     }\r
780 \r
781     /// <summary>\r
782     /// Creates a new object that is a copy of the current instance.\r
783     /// </summary>\r
784     public new COperator Clone()\r
785     {\r
786       return (COperator)Copy();\r
787     }\r
788 \r
789     /// <summary>\r
790     /// Implements the copy mechanism of this class.\r
791     /// </summary>\r
792     protected override CObject Copy()\r
793     {\r
794       CObject obj = base.Copy();\r
795       return obj;\r
796     }\r
797 \r
798     /// <summary>\r
799     /// Gets or sets the name of the operator\r
800     /// </summary>\r
801     /// <value>The name.</value>\r
802     public virtual string Name\r
803     {\r
804       get { return this.opcode.Name; }\r
805     }\r
806 \r
807     /// <summary>\r
808     /// Gets or sets the operands.\r
809     /// </summary>\r
810     /// <value>The operands.</value>\r
811     public CSequence Operands\r
812     {\r
813       get\r
814       {\r
815         if (this.seqence == null)\r
816           this.seqence = new CSequence();\r
817         return this.seqence;\r
818       }\r
819     }\r
820     CSequence seqence;\r
821 \r
822     /// <summary>\r
823     /// Gets the operator description for this instance.\r
824     /// </summary>\r
825     public OpCode OpCode\r
826     {\r
827       get { return this.opcode; }\r
828     }\r
829     OpCode opcode;\r
830 \r
831 \r
832     /// <summary>\r
833     /// Returns a string that represents the current operator.\r
834     /// </summary>\r
835     public override string ToString()\r
836     {\r
837       return this.Name;\r
838     }\r
839 \r
840     internal override void WriteObject(ContentWriter writer)\r
841     {\r
842       int count = this.seqence != null ? this.seqence.Count : 0;\r
843       for (int idx = 0; idx < count; idx++)\r
844         this.seqence[idx].WriteObject(writer);\r
845       writer.WriteLineRaw(ToString());\r
846     }\r
847   }\r
848 \r
849 #if true_\r
850   public class CGenericOperator : COperator\r
851   {\r
852     internal CGenericOperator(string name)\r
853     {\r
854       this.name = name;\r
855     }\r
856 \r
857     /// <summary>\r
858     /// Creates a new object that is a copy of the current instance.\r
859     /// </summary>\r
860     public new CGenericOperator Clone()\r
861     {\r
862       return (CGenericOperator)Copy();\r
863     }\r
864 \r
865     /// <summary>\r
866     /// Implements the copy mechanism of this class.\r
867     /// </summary>\r
868     protected override CObject Copy()\r
869     {\r
870       CObject obj = base.Copy();\r
871       return obj;\r
872     }\r
873 \r
874     /// <summary>\r
875     /// Gets or sets the name of the operator\r
876     /// </summary>\r
877     /// <value>The name.</value>\r
878     public override string Name\r
879     {\r
880       get { return this.name; }\r
881     }\r
882     string name;\r
883 \r
884 \r
885     /// <summary>\r
886     /// Returns a string that represents the current operator.\r
887     /// </summary>\r
888     public override string ToString()\r
889     {\r
890       return this.Name;\r
891     }\r
892   }\r
893 #endif\r
894 }\r