OPTPiX SpriteStudio SDK
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
ssvalue.h
1 #ifndef __SSVALUE__
2 #define __SSVALUE__
3 
4 #include "ssarchiver.h"
5 #include "ssstring_uty.h"
6 #include <map>
7 #include <vector>
8 #include <cassert>
9 
10 class SsValue;
11 
12 typedef wchar_t SsChar;
13 typedef std::vector<SsValue> SsArray;
14 typedef std::map<SsString,SsValue> SsHash;
15 
16 class SsValue{
17 public:
18  enum{
19  unkown,
20  string_type,
21  int_type,
22  float_type,
23  boolean_type,
24  hash_type,
25  array_type,
26  };
27 
28 public:
29  int type;
30  SsString name;
31 
32  union{
33  SsString* _str;
34  int _int;
35  float _float;
36  bool _bool;
37  SsArray* _array;
38  SsHash* _hash;
39  };
40 
41  int _int_temp;
42  float _float_temp;
43  bool _bool_temp;
44 
45 
46  SsValue() : type(unkown) , _str(0){}
47 
48  explicit SsValue(bool b) : type(boolean_type) { _bool = b; }
49  explicit SsValue(int n) : type(int_type) { _int = n; }
50  explicit SsValue(float n) : type(float_type) { _float = n; }
51  explicit SsValue(SsString& str) { type = string_type; _str = new SsString(str); }
52  explicit SsValue(const char* str) { type = string_type; _str = new SsString(str); }
53  explicit SsValue(SsArray& n)
54  {
55  type = array_type;
56  _array = new SsArray(n);
57  }
58 
59 
60  explicit SsValue(SsHash& n) { type = hash_type; _hash = new SsHash(n); }
61 
62 
63  SsValue(const SsValue& x)
64  {
65 
66  switch( x.type )
67  {
68  case string_type:
69  _str = new SsString( *x._str );
70  _float_temp = (float)atof( _str->c_str() );
71  _int_temp = atoi( _str->c_str() );
72  break;
73  case int_type:
74  _int = x._int;
75  _float_temp = (float)_int;
76  _bool_temp = _int == 1 ? true : false;
77  break;
78  case float_type:
79  _float = x._float;
80  _int_temp = (int)_float;
81  _bool_temp = _int > 0 ? true : false;
82  break;
83  case boolean_type:
84  _bool = x._bool;
85  break;
86  case array_type:
87  _array = new SsArray( *x._array);
88  break;
89  case hash_type:
90  _hash = new SsHash( *x._hash);
91  break;
92  }
93  type = x.type;
94 
95  }
96  SsValue& operator=(const SsValue& x)
97  {
98  if (this != &x) {
99  this->release();
100  name.~SsString();
101  new (this) SsValue(x);
102  }
103  return *this;
104  }
105 
106  //リリースの判断が甘い
107  void release()
108  {
109 
110  if ( type == string_type && _str) {
111  delete _str;
112  ;return;
113  }
114 
115  if ( type == array_type && _array){
116  delete _array;
117  ;return;
118  }
119  if ( type == hash_type && _hash )
120  {
121  delete _hash;
122 
123  return;
124  }
125  //_str = 0;
126 
127  }
128 
129  virtual ~SsValue() {
130  release();
131  }
132 
133  template <typename T> bool is() const;
134  template <typename T> const T& get() const;
135  template <typename T> T& get();
136 
137  const SsValue& operator[](const std::string& key) const
138  {
139  static SsValue r_value;
140 
141  if ( type == hash_type )
142  {
143  SsHash::const_iterator i = _hash->find(key);
144  return i != _hash->end() ? i->second : r_value;
145  }
146 
147  assert(1);
148  return *this;
149  }
150 
151  bool IsExistHashkey( const std::string& key ) const
152  {
153  if ( type == hash_type )
154  {
155  SsHash::const_iterator i = _hash->find(key);
156  return i != _hash->end();
157  }
158 
159  return false;
160  }
161 
162 };
163 
164 template <> inline const SsString& SsValue::get<SsString>() const {
165  static SsString ret = "";
166  if ( this->type != string_type )
167  {
168  return ret;
169  }
170  return *_str;
171 }
172 template <> inline SsString& SsValue::get<SsString>() {
173  static SsString ret = "";
174  if ( this->type != string_type )
175  {
176  return ret;
177  }
178  return *_str;
179 }
180 
181 template <> inline const int& SsValue::get<int>() const {
182  if ( this->type == float_type )
183  {
184  return _int_temp;
185  }else{
186  return _int;
187  }
188 }
189 template <> inline int& SsValue::get<int>() {
190  if ( this->type == float_type )
191  {
192  return _int_temp;
193  }else{
194  return _int;
195  }
196 }
197 
198 template <> inline const float& SsValue::get<float>() const {
199  if ( this->type == float_type )
200  {
201  return _float;
202  }else{
203  return _float_temp;
204  }
205 }
206 template <> inline float& SsValue::get<float>() {
207  if ( this->type == float_type )
208  {
209  return _float;
210  }else{
211  return _float_temp;
212  }
213 }
214 
215 template <> inline const bool& SsValue::get<bool>() const {
216  if ( this->type == boolean_type )
217  {
218  return _bool;
219  }else{
220  return _bool_temp;
221  }
222 }
223 template <> inline bool& SsValue::get<bool>() {
224  if ( this->type == boolean_type )
225  {
226  return _bool;
227  }else{
228  return _bool_temp;
229  }
230 }
231 
232 template <> inline const SsArray& SsValue::get<SsArray>() const {
233  return *_array;
234 }
235 template <> inline SsArray& SsValue::get<SsArray>() {
236  return *_array;
237 }
238 
239 
240 template <> inline const SsHash& SsValue::get<SsHash>() const {
241  return *_hash;
242 }
243 template <> inline SsHash& SsValue::get<SsHash>() {
244  return *_hash;
245 }
246 
247 
248 
249 template <> inline bool SsValue::is<bool>() const {
250  return type == boolean_type;
251 }
252 
253 template <> inline bool SsValue::is<int>() const {
254  return type == int_type;
255 }
256 
257 template <> inline bool SsValue::is<float>() const {
258  return type == float_type;
259 }
260 template <> inline bool SsValue::is<SsString>() const {
261  return type == string_type;
262 }
263 
264 template <> inline bool SsValue::is<SsArray>() const {
265  return type == array_type;
266 }
267 
268 template <> inline bool SsValue::is<SsHash>() const {
269  return type == hash_type;
270 }
271 
272 
273 
274 
275 static SsValue SsValueSeriarizer__MakeValue( const char* v )
276 {
277  std::string temp = v;
278  if ( is_digit_string( temp ) )
279  {
280  return SsValue( (float)atof( v ));
281  }else{
282  return SsValue( v );
283  }
284 
285 }
286 
287 
288 
289 //SsValue用のシリアライザ
290 void SsValueSeriarizer( ISsXmlArchiver* ar , SsValue& v , const std::string key = "value" );
291 
292 #endif