diff options
Diffstat (limited to '')
-rw-r--r-- | src/dictionary.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/dictionary.cpp b/src/dictionary.cpp new file mode 100644 index 0000000..385960f --- /dev/null +++ b/src/dictionary.cpp | |||
@@ -0,0 +1,145 @@ | |||
1 | #include "gats/dictionary.h" | ||
2 | |||
3 | #include "gats/boolean.h" | ||
4 | #include "gats/integer.h" | ||
5 | #include "gats/float.h" | ||
6 | #include "gats/string.h" | ||
7 | #include "gats/list.h" | ||
8 | |||
9 | template<> | ||
10 | uint32_t Bu::__calcHashCode<Gats::String>( const Gats::String &s ) | ||
11 | { | ||
12 | return __calcHashCode( dynamic_cast<const Bu::FString &>(s) ); | ||
13 | } | ||
14 | |||
15 | Gats::Dictionary::Dictionary() | ||
16 | { | ||
17 | } | ||
18 | |||
19 | Gats::Dictionary::~Dictionary() | ||
20 | { | ||
21 | for( iterator i = begin(); i; i++ ) | ||
22 | { | ||
23 | delete *i; | ||
24 | } | ||
25 | } | ||
26 | |||
27 | void Gats::Dictionary::write( Bu::Stream &rOut ) const | ||
28 | { | ||
29 | rOut.write("d", 1 ); | ||
30 | for( const_iterator i= begin(); i; i++ ) | ||
31 | { | ||
32 | i.getKey().write( rOut ); | ||
33 | (*i)->write( rOut ); | ||
34 | } | ||
35 | rOut.write("e", 1 ); | ||
36 | } | ||
37 | |||
38 | void Gats::Dictionary::read( Bu::Stream &rIn, char cType ) | ||
39 | { | ||
40 | for(;;) | ||
41 | { | ||
42 | char cNext; | ||
43 | rIn.read( &cNext, 1 ); | ||
44 | if( cNext == 'e' ) | ||
45 | break; | ||
46 | if( cNext != 's' ) | ||
47 | throw Bu::ExceptionBase("You can only use strings as keys."); | ||
48 | Gats::String sKey; | ||
49 | sKey.read( rIn, cNext ); | ||
50 | |||
51 | ((Bu::Hash<Gats::String, Gats::Object *> *)this)->insert( | ||
52 | sKey, Gats::Object::read( rIn ) | ||
53 | ); | ||
54 | } | ||
55 | } | ||
56 | |||
57 | void Gats::Dictionary::insert( const Bu::FString &sKey, int64_t i ) | ||
58 | { | ||
59 | ((Bu::Hash<Gats::String, Gats::Object *> *)this)->insert( | ||
60 | sKey, new Gats::Integer( i ) | ||
61 | ); | ||
62 | } | ||
63 | |||
64 | void Gats::Dictionary::insert( const Bu::FString &sKey, bool b ) | ||
65 | { | ||
66 | Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
67 | sKey, new Gats::Boolean( b ) | ||
68 | ); | ||
69 | } | ||
70 | |||
71 | void Gats::Dictionary::insert( const Bu::FString &sKey, double d ) | ||
72 | { | ||
73 | // Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
74 | // sKey, new Gats::Float( d ) | ||
75 | // ); | ||
76 | } | ||
77 | |||
78 | void Gats::Dictionary::insert( const Bu::FString &sKey, const Bu::FString &s ) | ||
79 | { | ||
80 | Bu::Hash<Gats::String, Gats::Object *>::insert( | ||
81 | sKey, new Gats::String( s ) | ||
82 | ); | ||
83 | } | ||
84 | |||
85 | bool Gats::Dictionary::getBool( const Bu::FString &sKey ) | ||
86 | { | ||
87 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( get( sKey ) ); | ||
88 | if( pOb ) | ||
89 | throw Bu::ExceptionBase("Cannot cast item '%s' to bool.", | ||
90 | sKey.getStr() ); | ||
91 | |||
92 | return pOb->getValue(); | ||
93 | } | ||
94 | |||
95 | int64_t Gats::Dictionary::getInt( const Bu::FString &sKey ) | ||
96 | { | ||
97 | Gats::Integer *pOb = dynamic_cast<Gats::Integer *>( get( sKey ) ); | ||
98 | if( pOb ) | ||
99 | throw Bu::ExceptionBase("Cannot cast item '%s' to int.", | ||
100 | sKey.getStr() ); | ||
101 | |||
102 | return pOb->getValue(); | ||
103 | } | ||
104 | |||
105 | double Gats::Dictionary::getFloat( const Bu::FString &sKey ) | ||
106 | {/* | ||
107 | Gats::Boolean *pOb = dynamic_cast<Gats::Boolean *>( get( sKey ) ); | ||
108 | if( pOb ) | ||
109 | throw Bu::ExceptionBase("Cannot cast item '%s' to bool.", | ||
110 | sKey.getStr() ); | ||
111 | |||
112 | return pOb->getValue();*/ | ||
113 | return 0.0; | ||
114 | } | ||
115 | |||
116 | Bu::FString Gats::Dictionary::getStr( const Bu::FString &sKey ) | ||
117 | { | ||
118 | Gats::String *pOb = dynamic_cast<Gats::String *>( get( sKey ) ); | ||
119 | if( pOb ) | ||
120 | throw Bu::ExceptionBase("Cannot cast item '%s' to string.", | ||
121 | sKey.getStr() ); | ||
122 | |||
123 | return *pOb; | ||
124 | } | ||
125 | |||
126 | Gats::List *Gats::Dictionary::getList( const Bu::FString &sKey ) | ||
127 | { | ||
128 | Gats::List *pOb = dynamic_cast<Gats::List *>( get( sKey ) ); | ||
129 | if( pOb ) | ||
130 | throw Bu::ExceptionBase("Cannot cast item '%s' to list.", | ||
131 | sKey.getStr() ); | ||
132 | |||
133 | return pOb; | ||
134 | } | ||
135 | |||
136 | Gats::Dictionary *Gats::Dictionary::getDict( const Bu::FString &sKey ) | ||
137 | { | ||
138 | Gats::Dictionary *pOb = dynamic_cast<Gats::Dictionary *>( get( sKey ) ); | ||
139 | if( pOb ) | ||
140 | throw Bu::ExceptionBase("Cannot cast item '%s' to dictionary.", | ||
141 | sKey.getStr() ); | ||
142 | |||
143 | return pOb; | ||
144 | } | ||
145 | |||