diff options
Diffstat (limited to 'cs-dotnet')
-rw-r--r-- | cs-dotnet/src/gatsboolean.cs | 9 | ||||
-rw-r--r-- | cs-dotnet/src/gatsdictionary.cs | 129 | ||||
-rw-r--r-- | cs-dotnet/src/gatsfloat.cs | 33 | ||||
-rw-r--r-- | cs-dotnet/src/gatsinteger.cs | 12 | ||||
-rw-r--r-- | cs-dotnet/src/gatslist.cs | 108 | ||||
-rw-r--r-- | cs-dotnet/src/gatsnull.cs | 11 | ||||
-rw-r--r-- | cs-dotnet/src/gatsstring.cs | 16 | ||||
-rw-r--r-- | cs-dotnet/src/tests/dictionary.cs | 8 |
8 files changed, 322 insertions, 4 deletions
diff --git a/cs-dotnet/src/gatsboolean.cs b/cs-dotnet/src/gatsboolean.cs index 11c8115..0fcc6e9 100644 --- a/cs-dotnet/src/gatsboolean.cs +++ b/cs-dotnet/src/gatsboolean.cs | |||
@@ -9,6 +9,15 @@ using System.IO; | |||
9 | 9 | ||
10 | namespace Com.Xagasoft.Gats | 10 | namespace Com.Xagasoft.Gats |
11 | { | 11 | { |
12 | /// <summary> | ||
13 | /// Encapsulates a single bool value. | ||
14 | /// </summary> | ||
15 | /// <remarks> | ||
16 | /// The boolean type is one of the simpler ones encoding-wise. Instead of | ||
17 | /// a single type specfiier in the encoded GATS format, it uses two, and | ||
18 | /// no payload. A '1' type specifier indicates a boolean value of true, and | ||
19 | /// a '0' type specfiier indicates a false. | ||
20 | /// </remarks> | ||
12 | public class GatsBoolean : GatsObject | 21 | public class GatsBoolean : GatsObject |
13 | { | 22 | { |
14 | public bool Value { get; set; } | 23 | public bool Value { get; set; } |
diff --git a/cs-dotnet/src/gatsdictionary.cs b/cs-dotnet/src/gatsdictionary.cs index af7f72a..77d088c 100644 --- a/cs-dotnet/src/gatsdictionary.cs +++ b/cs-dotnet/src/gatsdictionary.cs | |||
@@ -13,6 +13,26 @@ using System.Collections.Generic; | |||
13 | 13 | ||
14 | namespace Com.Xagasoft.Gats | 14 | namespace Com.Xagasoft.Gats |
15 | { | 15 | { |
16 | /// <summary> | ||
17 | /// Encapsulates a single dictionary of GatsObjects. | ||
18 | /// </summary> | ||
19 | /// <remarks> | ||
20 | /// All keys are strings, and are encoded UTF-8. At the moment it is | ||
21 | /// advisable to stick to 7-bit ASCII or LATIN-1 compatible strings for | ||
22 | /// interoperability. If you want full unicode for keys, be sure you | ||
23 | /// handle it correctly with all libraries. | ||
24 | /// | ||
25 | /// Values can be any valid GatsObject. | ||
26 | /// | ||
27 | /// Just like dictionaries in memory, order is not important and is | ||
28 | /// considered random in encoded GATS. This means that dictionary items | ||
29 | /// may be in a different order after writing them and reading them back | ||
30 | /// again. Do not rely on a specific order, if you need ordered data use | ||
31 | /// a GatsList. | ||
32 | /// | ||
33 | /// All standard dictionary interface methods are implemented, so you can | ||
34 | /// use a GatsDictionary just like the .NET standard Dictionary. | ||
35 | /// </remarks> | ||
16 | public class GatsDictionary : GatsObject, IDictionary<string, GatsObject> | 36 | public class GatsDictionary : GatsObject, IDictionary<string, GatsObject> |
17 | // ICollection<KeyValuePair<string, GatsObject>>, | 37 | // ICollection<KeyValuePair<string, GatsObject>>, |
18 | // IEnumerable<KeyValuePair<string, GatsObject>> | 38 | // IEnumerable<KeyValuePair<string, GatsObject>> |
@@ -68,6 +88,115 @@ namespace Com.Xagasoft.Gats | |||
68 | } | 88 | } |
69 | 89 | ||
70 | // | 90 | // |
91 | // Extra helper functions for making life with GATS easier | ||
92 | // | ||
93 | |||
94 | /// <summary> | ||
95 | /// Helper function to add a new GatsString to the dictionary from a | ||
96 | /// byte array. | ||
97 | /// </summary> | ||
98 | /// <param name="key">The key to insert the new value with</param> | ||
99 | /// <param name="val">The byte array to be inserted as a string</param> | ||
100 | public void Add( string key, byte[] val ) | ||
101 | { | ||
102 | Add( key, new GatsString( val ) ); | ||
103 | } | ||
104 | |||
105 | /// <summary> | ||
106 | /// Helper function to add a new GatsString to the dictionary from a | ||
107 | /// string. | ||
108 | /// </summary> | ||
109 | /// <remarks> | ||
110 | /// The string is encoded UTF-8 by .NETs internal facilities. | ||
111 | /// </remarks> | ||
112 | /// <param name="key">The key to insert the new value with</param> | ||
113 | /// <param name="val">The string to be inserted as a string</param> | ||
114 | public void Add( string key, string val ) | ||
115 | { | ||
116 | Add( key, new GatsString( val ) ); | ||
117 | } | ||
118 | |||
119 | /// <summary> | ||
120 | /// Helper function to add a new GatsInteger to the dictionary. | ||
121 | /// </summary> | ||
122 | /// <remarks> | ||
123 | /// Implicit upcasting should allow all integer types (byte, short, | ||
124 | /// int, long), and automatic unboxing should allow all object variants | ||
125 | /// to be passed into this method without problem. | ||
126 | /// </remarks> | ||
127 | /// <param name="key">The key to insert the new value with</param> | ||
128 | /// <param name="val">The long to be inserted</param> | ||
129 | public void Add( string key, long val ) | ||
130 | { | ||
131 | Add( key, new GatsInteger( val ) ); | ||
132 | } | ||
133 | |||
134 | /// <summary> | ||
135 | /// Helper function to add a new GatsFloat to the dictionary. | ||
136 | /// </summary> | ||
137 | /// <remarks> | ||
138 | /// Implicit upcasting should allow floats and doubles to both be | ||
139 | /// accepted by this method. Please note that decimal types are not | ||
140 | /// strictly compatible, please see GatsFloat for more details. | ||
141 | /// </remarks> | ||
142 | /// <param name="key">The key to insert the new value with</param> | ||
143 | /// <param name="val">The double to be inserted</param> | ||
144 | public void Add( string key, double val ) | ||
145 | { | ||
146 | Add( key, new GatsFloat( val ) ); | ||
147 | } | ||
148 | |||
149 | /// <summary> | ||
150 | /// Helper function to add a new GatsBoolean to the dictionary. | ||
151 | /// </summary> | ||
152 | /// <param name="key">The key to insert the new value with</param> | ||
153 | /// <param name="val">The boolean value to be inserted</param> | ||
154 | public void Add( string key, bool val ) | ||
155 | { | ||
156 | Add( key, new GatsBoolean( val ) ); | ||
157 | } | ||
158 | |||
159 | /// <summary> | ||
160 | /// Helper function to add a new GatsNull to the dictionary. | ||
161 | /// </summary> | ||
162 | /// <param name="key">The key to insert the new null value with</param> | ||
163 | public void AddNull( string key ) | ||
164 | { | ||
165 | Add( key, new GatsNull() ); | ||
166 | } | ||
167 | |||
168 | /// <summary> | ||
169 | /// Helper function to add a new GatsDictionary to the dictionary. | ||
170 | /// </summary> | ||
171 | /// <remarks> | ||
172 | /// A new GatsDictionary is created, added to the dictionary, and | ||
173 | /// returned. | ||
174 | /// </remarks> | ||
175 | /// <param name="key">The key to insert the new value with</param> | ||
176 | /// <returns>A new, empty dictionary that is already added</returns> | ||
177 | public GatsDictionary AddDict( string key ) | ||
178 | { | ||
179 | GatsDictionary dict = new GatsDictionary(); | ||
180 | Add( key, dict ); | ||
181 | return dict; | ||
182 | } | ||
183 | |||
184 | /// <summary> | ||
185 | /// Helper function to add a new GatsList to the dictionary. | ||
186 | /// </summary> | ||
187 | /// <remarks> | ||
188 | /// A new GatsList is created, added to the dictionary, and returned. | ||
189 | /// </remarks> | ||
190 | /// <param name="key">The key to insert the new value with</param> | ||
191 | /// <returns>A new, empty list that is already added</returns> | ||
192 | public GatsList AddList( string key ) | ||
193 | { | ||
194 | GatsList list = new GatsList(); | ||
195 | Add( key, list ); | ||
196 | return list; | ||
197 | } | ||
198 | |||
199 | // | ||
71 | // List interface overrides under here. | 200 | // List interface overrides under here. |
72 | // | 201 | // |
73 | public void Add( string key, GatsObject obj ) | 202 | public void Add( string key, GatsObject obj ) |
diff --git a/cs-dotnet/src/gatsfloat.cs b/cs-dotnet/src/gatsfloat.cs index 4709097..9763855 100644 --- a/cs-dotnet/src/gatsfloat.cs +++ b/cs-dotnet/src/gatsfloat.cs | |||
@@ -10,6 +10,31 @@ using System; | |||
10 | 10 | ||
11 | namespace Com.Xagasoft.Gats | 11 | namespace Com.Xagasoft.Gats |
12 | { | 12 | { |
13 | /// <summary> | ||
14 | /// Encapsulates a single floating point value. | ||
15 | /// </summary> | ||
16 | /// <remarks> | ||
17 | /// The GATS floating point encoding is bit-exact with any standard | ||
18 | /// floating point encoding similar to the IEEE encoding. This means that | ||
19 | /// unlike textual encoding you will always get the exact same floating | ||
20 | /// point value back that you encoded. This format is arbitrary precision | ||
21 | /// and not dependant on platform or hardware. | ||
22 | /// | ||
23 | /// Although the format is arbitrary precision, the backend in C# uses a | ||
24 | /// double for maximum precision without resorting to a software arbitrary | ||
25 | /// precision library. | ||
26 | /// | ||
27 | /// Interestingly, unlike many other languages, C# provides a decimal type | ||
28 | /// that is also floating point, however the decimal type is encoded using | ||
29 | /// a bcd-like scheme. This makes it an excellent choice for many human | ||
30 | /// activities, but it cannot be encoded precisely as a GatsFloat. If you | ||
31 | /// would like to preserve the decimal nature of those types it may be | ||
32 | /// better to encode them as strings. | ||
33 | /// | ||
34 | /// In encoding, the GATS float uses two different type specifiers, an 'f' | ||
35 | /// indicates a normal floating point value. An 'F' represents a special | ||
36 | /// value: positive or negative NaN, infinity, or zero. | ||
37 | /// </remarks> | ||
13 | public class GatsFloat : GatsObject | 38 | public class GatsFloat : GatsObject |
14 | { | 39 | { |
15 | private static readonly double Log256 = Math.Log( 256.0 ); | 40 | private static readonly double Log256 = Math.Log( 256.0 ); |
@@ -41,10 +66,10 @@ namespace Com.Xagasoft.Gats | |||
41 | { | 66 | { |
42 | case 'N': Value = -Double.NaN; break; | 67 | case 'N': Value = -Double.NaN; break; |
43 | case 'n': Value = Double.NaN; break; | 68 | case 'n': Value = Double.NaN; break; |
44 | case 'I': Value = Double.NegativeInfinity; break; | 69 | case 'I': Value = Double.NegativeInfinity; break; |
45 | case 'i': Value = Double.PositiveInfinity; break; | 70 | case 'i': Value = Double.PositiveInfinity; break; |
46 | case 'Z': Value = -0.0; break; | 71 | case 'Z': Value = -0.0; break; |
47 | case 'z': Value = 0.0; break; | 72 | case 'z': Value = 0.0; break; |
48 | } | 73 | } |
49 | } | 74 | } |
50 | else if( type == 'f' ) | 75 | else if( type == 'f' ) |
diff --git a/cs-dotnet/src/gatsinteger.cs b/cs-dotnet/src/gatsinteger.cs index 268769b..5ef17d8 100644 --- a/cs-dotnet/src/gatsinteger.cs +++ b/cs-dotnet/src/gatsinteger.cs | |||
@@ -9,6 +9,18 @@ using System.IO; | |||
9 | 9 | ||
10 | namespace Com.Xagasoft.Gats | 10 | namespace Com.Xagasoft.Gats |
11 | { | 11 | { |
12 | /// <summary> | ||
13 | /// Encapsulates a single integer value. | ||
14 | /// </summary> | ||
15 | /// <remarks> | ||
16 | /// The GATS integer encoding is arbitrary precision, and only consumes as | ||
17 | /// many bytes as it needs to represent a given number. There is no such | ||
18 | /// thing as an unsigned GATS integer. | ||
19 | /// | ||
20 | /// Internally the GatsInteger stores it's value in a long. | ||
21 | /// | ||
22 | /// In encoding, the type specifier for a GATS integer is 'i'. | ||
23 | /// </remarks> | ||
12 | public class GatsInteger : GatsObject | 24 | public class GatsInteger : GatsObject |
13 | { | 25 | { |
14 | public long Value { get; set; } | 26 | public long Value { get; set; } |
diff --git a/cs-dotnet/src/gatslist.cs b/cs-dotnet/src/gatslist.cs index 7d57035..0f93d1e 100644 --- a/cs-dotnet/src/gatslist.cs +++ b/cs-dotnet/src/gatslist.cs | |||
@@ -13,6 +13,15 @@ using System.Collections.Generic; | |||
13 | 13 | ||
14 | namespace Com.Xagasoft.Gats | 14 | namespace Com.Xagasoft.Gats |
15 | { | 15 | { |
16 | /// <summary> | ||
17 | /// Encapsulates a single list of GatsObjects. | ||
18 | /// </summary> | ||
19 | /// <remarks> | ||
20 | /// A list of arbitrary size containing ordered GatsObjects. All standard | ||
21 | /// .NET IList, ICollection, and IEnumerable interfaces are implemented, | ||
22 | /// so a GatsList should work just like a standard List, but with a few | ||
23 | /// extras. | ||
24 | /// </remarks> | ||
16 | public class GatsList : GatsObject, IList<GatsObject>, | 25 | public class GatsList : GatsObject, IList<GatsObject>, |
17 | ICollection<GatsObject>, IEnumerable<GatsObject> | 26 | ICollection<GatsObject>, IEnumerable<GatsObject> |
18 | // IReadOnlyList<GatsObject>, IReadOnlyCollection<GatsObject>, | 27 | // IReadOnlyList<GatsObject>, IReadOnlyCollection<GatsObject>, |
@@ -60,6 +69,105 @@ namespace Com.Xagasoft.Gats | |||
60 | } | 69 | } |
61 | 70 | ||
62 | // | 71 | // |
72 | // Helper functions | ||
73 | // | ||
74 | |||
75 | /// <summary> | ||
76 | /// Helper function to add a new GatsString to the list. | ||
77 | /// </summary> | ||
78 | /// <param name="val">The byte array to be added as a GatsString</param> | ||
79 | public void Add( byte[] val ) | ||
80 | { | ||
81 | Add( new GatsString( val ) ); | ||
82 | } | ||
83 | |||
84 | /// <summary> | ||
85 | /// Helper function to add a new GatsString to the list. | ||
86 | /// </summary> | ||
87 | /// <remarks> | ||
88 | /// The string is encoded UTF-8 by .NETs internal facilities. | ||
89 | /// </remarks> | ||
90 | /// <param name="val">The string to be added as a GatsString</param> | ||
91 | public void Add( string val ) | ||
92 | { | ||
93 | Add( new GatsString( val ) ); | ||
94 | } | ||
95 | |||
96 | /// <summary> | ||
97 | /// Helper function to add a new GatsInteger to the list. | ||
98 | /// </summary> | ||
99 | /// <remarks> | ||
100 | /// Implicit upcasting should allow all integer types (byte, short, | ||
101 | /// int, long), and automatic unboxing should allow all object variants | ||
102 | /// to be passed into this method without problem. | ||
103 | /// </remarks> | ||
104 | /// <param name="val">The long to be added as a GatsInteger</param> | ||
105 | public void Add( long val ) | ||
106 | { | ||
107 | Add( new GatsInteger( val ) ); | ||
108 | } | ||
109 | |||
110 | /// <summary> | ||
111 | /// Helper function to add a new GatsFloat to the list. | ||
112 | /// </summary> | ||
113 | /// <remarks> | ||
114 | /// Implicit upcasting should allow floats and doubles to both be | ||
115 | /// accepted by this method. Please note that decimal types are not | ||
116 | /// strictly compatible, please see GatsFloat for more details. | ||
117 | /// </remarks> | ||
118 | /// <param name="val">The double to be added as a GatsFloat</param> | ||
119 | public void Add( double val ) | ||
120 | { | ||
121 | Add( new GatsFloat( val ) ); | ||
122 | } | ||
123 | |||
124 | /// <summary> | ||
125 | /// Helper function to add a new GatsBoolean to the list. | ||
126 | /// </summary> | ||
127 | /// <param name="val"> | ||
128 | /// The boolean value to be added as a GatsBoolean | ||
129 | /// </param> | ||
130 | public void Add( bool val ) | ||
131 | { | ||
132 | Add( new GatsBoolean( val ) ); | ||
133 | } | ||
134 | |||
135 | /// <summary> | ||
136 | /// Helper to append a GatsNull to the list. | ||
137 | /// </summary> | ||
138 | public void AddNull() | ||
139 | { | ||
140 | Add( new GatsNull() ); | ||
141 | } | ||
142 | |||
143 | /// <summary> | ||
144 | /// Helper to append a GatsDictionary to the list. | ||
145 | /// </summary> | ||
146 | /// <remarks> | ||
147 | /// A new GatsDictionary is constructed, appended to the list, and | ||
148 | /// returned. | ||
149 | /// </remarks> | ||
150 | public GatsDictionary AddDict() | ||
151 | { | ||
152 | GatsDictionary dict = new GatsDictionary(); | ||
153 | Add( dict ); | ||
154 | return dict; | ||
155 | } | ||
156 | |||
157 | /// <summary> | ||
158 | /// Helper to append a GatsList to the list. | ||
159 | /// </summary> | ||
160 | /// <remarks> | ||
161 | /// A new GatsList is constructed, appended to the list, and returned. | ||
162 | /// </remarks> | ||
163 | public GatsList AddList() | ||
164 | { | ||
165 | GatsList list = new GatsList(); | ||
166 | Add( list ); | ||
167 | return list; | ||
168 | } | ||
169 | |||
170 | // | ||
63 | // List interface overrides under here. | 171 | // List interface overrides under here. |
64 | // | 172 | // |
65 | public int IndexOf( GatsObject obj ) | 173 | public int IndexOf( GatsObject obj ) |
diff --git a/cs-dotnet/src/gatsnull.cs b/cs-dotnet/src/gatsnull.cs index 009676f..49ca243 100644 --- a/cs-dotnet/src/gatsnull.cs +++ b/cs-dotnet/src/gatsnull.cs | |||
@@ -9,6 +9,17 @@ using System.IO; | |||
9 | 9 | ||
10 | namespace Com.Xagasoft.Gats | 10 | namespace Com.Xagasoft.Gats |
11 | { | 11 | { |
12 | /// <summary> | ||
13 | /// Represents a NULL value. | ||
14 | /// </summary> | ||
15 | /// <remarks> | ||
16 | /// There are a couple of reasons for using a real, instantiated object to | ||
17 | /// represent NULL instead of just using null. Primarily, however, it is | ||
18 | /// important to know the difference between an intentionally encoded null | ||
19 | /// and an absence of any object at all. | ||
20 | /// | ||
21 | /// The GatsNull doesn't contain any fields. | ||
22 | /// </remarks> | ||
12 | public class GatsNull : GatsObject | 23 | public class GatsNull : GatsObject |
13 | { | 24 | { |
14 | public GatsNull() | 25 | public GatsNull() |
diff --git a/cs-dotnet/src/gatsstring.cs b/cs-dotnet/src/gatsstring.cs index 3fa3b7e..0935b05 100644 --- a/cs-dotnet/src/gatsstring.cs +++ b/cs-dotnet/src/gatsstring.cs | |||
@@ -9,6 +9,22 @@ using System.IO; | |||
9 | 9 | ||
10 | namespace Com.Xagasoft.Gats | 10 | namespace Com.Xagasoft.Gats |
11 | { | 11 | { |
12 | /// <summary> | ||
13 | /// Encapsulates a single byte array. | ||
14 | /// </summary> | ||
15 | /// <remarks> | ||
16 | /// A GATS string, unlike a C# string primitive, is simply an array of | ||
17 | /// bytes. This is actually more flexible in many ways, as it allows a | ||
18 | /// GatsString to contain any binary data. However, to encode textual data | ||
19 | /// there is no hard and fast standard. If a string primitive is passed | ||
20 | /// into a GatsString it will be encoded into UTF-8. If you would rather | ||
21 | /// use a different encoding then encode your data first, and then pass it | ||
22 | /// in as a byte array. | ||
23 | /// | ||
24 | /// The ToString implementation provided by GatsString also assumes that | ||
25 | /// the contained data is UTF-8 encoded. This may cause some minor issues | ||
26 | /// when attempting to debug strings that contain binary. | ||
27 | /// </remarks> | ||
12 | public class GatsString : GatsObject | 28 | public class GatsString : GatsObject |
13 | { | 29 | { |
14 | public byte[] Value { get; set; } | 30 | public byte[] Value { get; set; } |
diff --git a/cs-dotnet/src/tests/dictionary.cs b/cs-dotnet/src/tests/dictionary.cs index b97cb7d..78fec38 100644 --- a/cs-dotnet/src/tests/dictionary.cs +++ b/cs-dotnet/src/tests/dictionary.cs | |||
@@ -37,6 +37,14 @@ public class Test | |||
37 | d.Add("float", new GatsFloat( 87.332 ) ); | 37 | d.Add("float", new GatsFloat( 87.332 ) ); |
38 | d.Add("string", new GatsString("Yup, a string") ); | 38 | d.Add("string", new GatsString("Yup, a string") ); |
39 | d.Add("bool", new GatsBoolean( false ) ); | 39 | d.Add("bool", new GatsBoolean( false ) ); |
40 | d.Add("long", 998877665544L ); | ||
41 | d.Add("int2", 998877 ); | ||
42 | d.Add("short", (short)9988 ); | ||
43 | d.Add("byte", (byte)99 ); | ||
44 | d.Add("float2", 87.332F ); | ||
45 | d.Add("double", 87.332D ); | ||
46 | d.Add("string2", "Yup, a string" ); | ||
47 | d.Add("bool2", false ); | ||
40 | Write( d, ms ); | 48 | Write( d, ms ); |
41 | ms.Seek( 0, SeekOrigin.Begin ); | 49 | ms.Seek( 0, SeekOrigin.Begin ); |
42 | Read( ms ); | 50 | Read( ms ); |