Wolframe, 0.0.3

variantStruct.hpp
Go to the documentation of this file.
1 /************************************************************************
2 Copyright (C) 2011 - 2014 Project Wolframe.
3 All rights reserved.
4 
5 This file is part of Project Wolframe.
6 
7 Commercial Usage
8 Licensees holding valid Project Wolframe Commercial licenses may
9 use this file in accordance with the Project Wolframe
10 Commercial License Agreement provided with the Software or,
11 alternatively, in accordance with the terms contained
12 in a written agreement between the licensee and Project Wolframe.
13 
14 GNU General Public License Usage
15 Alternatively, you can redistribute this file and/or modify it
16 under the terms of the GNU General Public License as published by
17 the Free Software Foundation, either version 3 of the License, or
18 (at your option) any later version.
19 
20 Wolframe is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 GNU General Public License for more details.
24 
25 You should have received a copy of the GNU General Public License
26 along with Wolframe. If not, see <http://www.gnu.org/licenses/>.
27 
28 If you have questions regarding the use of this file, please contact
29 Project Wolframe.
30 
31 ************************************************************************/
34 
35 #ifndef _Wolframe_TYPES_VARIANT_STRUCT_HPP_INCLUDED
36 #define _Wolframe_TYPES_VARIANT_STRUCT_HPP_INCLUDED
37 #include <string>
38 #include <map>
39 #include <iostream>
40 #include <utility>
41 #include "types/variant.hpp"
42 #include "utils/printFormats.hpp"
43 
44 namespace _Wolframe {
45 namespace utils {
47  struct PrintFormat;
48 }
49 namespace types {
50 
52 class VariantStructDescription;
54 class IndirectionDescription;
55 
57 class VariantStruct :public Variant
58 {
59 public:
60  typedef std::map<std::string,const VariantStructDescription*> ResolveMap;
61 
64  enum Type
65  {
79  };
81  static const char* typeName( Type i) {return Variant::typeName( (Variant::Type)i);}
82  const char* typeName() const {return typeName( (VariantStruct::Type)type());}
83 
94 
96  void makeArray();
97 
100  VariantStruct& operator=( const Variant& o) {bool init_=initialized(); VariantStruct::release(); Variant::initCopy( o); setInitialized(init_); return *this;}
101 
103  void clear() {release(); init();}
104 
105 public:
107  bool operator==( const VariantStruct& o) const {return compare( o) == 0;}
108  bool operator!=( const VariantStruct& o) const {int cv = compare( o); return cv != 0;}
109  bool operator>( const VariantStruct& o) const {int cv = compare( o); return cv > 0;}
110  bool operator>=( const VariantStruct& o) const {int cv = compare( o); return cv >= 0;}
111  bool operator<=( const VariantStruct& o) const {int cv = compare( o); return cv <= 0;}
112  bool operator<( const VariantStruct& o) const {int cv = compare( o); return cv < 0;}
113  int compare( const VariantStruct& o) const;
114 
116  Type type() const {return (Type)m_type;}
117 
119  std::size_t nof_elements() const;
120 
123  void setDescription( const VariantStructDescription* descr);
124 
125  typedef std::map< const VariantStructDescription*, const VariantStructDescription*> DescriptionAssignmentMap;
126  void setIndirectionDescription( const DescriptionAssignmentMap& assignmentmap);
127 
129  const VariantStruct* prototype() const {return ((Type)m_type == Array)?(const VariantStruct*)m_data.value.Ref:0;}
131 
133  const std::string unresolvedName() const {if ((Type)m_type != Unresolved) throw std::logic_error("undefined access of unresolved name"); return std::string( (const char*)m_data.value.Ref, m_data.dim.size);}
135  void resolve( const ResolveMap& rmap);
136 
138  void expandIndirection();
139 
141  void push();
142 
144  std::string tostring( const utils::PrintFormat* pformat=0) const;
145 
147  const VariantStruct& operator[]( std::size_t idx) const;
148  VariantStruct& operator[]( std::size_t idx);
149 
151  const VariantStruct* at( std::size_t idx) const;
152  VariantStruct* at( std::size_t idx);
153 
155  const VariantStruct& back() const;
156  VariantStruct& back();
157 
159  const VariantStruct* select( const std::string& name) const;
160  VariantStruct* select( const std::string& name);
161 
162 public:
165  {
166  public:
167  const_iterator( VariantStruct const* itr_) :m_itr(itr_){}
169 
170  int compare( const const_iterator& o) const;
171 
172  bool operator==( const const_iterator& o) const {return compare(o) == 0;}
173  bool operator!=( const const_iterator& o) const {return compare(o) != 0;}
174  bool operator<( const const_iterator& o) const {return compare(o) < 0;}
175  bool operator<=( const const_iterator& o) const {return compare(o) <= 0;}
176  bool operator>( const const_iterator& o) const {return compare(o) > 0;}
177  bool operator>=( const const_iterator& o) const {return compare(o) >= 0;}
178 
179  const_iterator& operator++() {++m_itr; return *this;}
180  const_iterator operator++(int) {const_iterator rt(*this); ++m_itr; return rt;}
181 
182  const VariantStruct* operator->() const {return m_itr;}
183  const VariantStruct& operator*() const {return *m_itr;}
184 
185  int operator - (const const_iterator& o) const {if (!o.m_itr || !m_itr) throw std::logic_error("illegal operation"); return m_itr - o.m_itr;}
186  const_iterator operator + (int i) const {if (!m_itr) throw std::logic_error("illegal operation"); return m_itr + i;}
187 
188  private:
190  };
191 
193  class iterator
194  {
195  public:
196  iterator( VariantStruct* itr_) :m_itr(itr_){}
197  iterator( const iterator& o) :m_itr(o.m_itr){}
198 
199  int compare( const iterator& o) const;
200 
201  bool operator==( const iterator& o) const {return compare(o) == 0;}
202  bool operator!=( const iterator& o) const {return compare(o) != 0;}
203  bool operator<( const iterator& o) const {return compare(o) < 0;}
204  bool operator<=( const iterator& o) const {return compare(o) <= 0;}
205  bool operator>( const iterator& o) const {return compare(o) > 0;}
206  bool operator>=( const iterator& o) const {return compare(o) >= 0;}
207 
208  iterator& operator++() {++m_itr; return *this;}
209  iterator operator++(int) {iterator rt(*this); ++m_itr; return rt;}
210 
213 
214  int operator - (const iterator& o) const {if (!o.m_itr || !m_itr) throw std::logic_error("illegal operation"); return m_itr - o.m_itr;}
215  iterator operator + (int i) const {if (!m_itr) throw std::logic_error("illegal operation"); return m_itr + i;}
216 
217  private:
219  };
220 
221 public:
223  void print( std::ostream& out, const utils::PrintFormat* pformat, std::size_t level=0) const;
224 
226  const_iterator find( const std::string& name_) const;
227  iterator find( const std::string& name_);
228 
230  const_iterator find_cis( const std::string& name_) const;
231  iterator find_cis( const std::string& name_);
232 
234  const_iterator begin() const {return elementptr(0);}
235  iterator begin() {return elementptr(0);}
239 
240 private:
242  const VariantStruct* elementptr( std::size_t idx) const;
243  VariantStruct* elementptr( std::size_t idx);
244 
245  friend class VariantUnresolved;
246  friend class VariantStructConst;
247  void setType( Type type_) {m_type = (unsigned char)type_;}
248 
249  static int compareArray( std::size_t size, const VariantStruct* a1, const VariantStruct* a2);
250  void initStruct( const VariantStructDescription* descr);
251  void initCopy( const VariantStruct& orig);
252  void initConstCopy( const VariantStruct& o);
253  void initConstCopy( const Variant& o);
254  void initUnresolved( const std::string& name_);
255  void initIndirection( const VariantStructDescription* descr);
256 
257  void release();
258  void check() const;
259 };
260 
261 
265 {
266 public:
268  explicit VariantIndirection( const VariantStructDescription* descr);
270 };
271 
272 
276 {
277 public:
279  explicit VariantUnresolved( const std::string& name_);
280 };
281 
282 
287 {
288  public:
299  VariantStructConst( const char* o) {initConstant( o, std::strlen(o));}
300  VariantStructConst( const char* o, std::size_t n) {initConstant( o, n);}
301  VariantStructConst( const std::string& o) {initConstant( o.c_str(), o.size());}
304 
306  VariantStructConst& operator=( const Variant& o) {bool init_=initialized(); initConstCopy( o); setInitialized(init_); return *this;}
307  VariantStructConst& operator=( const VariantConst& o) {bool init_=initialized(); initConstCopy( o); setInitialized(init_); return *this;}
310  VariantStructConst& operator=( float o) {bool init_=initialized(); Variant::init(Variant::Double); m_data.value.Double = (double)o; setInitialized(init_); setConstant(); return *this;}
312  VariantStructConst& operator=( unsigned int o) {bool init_=initialized(); Variant::init(Variant::UInt); m_data.value.UInt = o; setInitialized(init_); setConstant(); return *this;}
313  VariantStructConst& operator=( const char* o) {bool init_=initialized(); initConstant( o, std::strlen(o)); setInitialized(init_); return *this;}
314  VariantStructConst& operator=( const std::string& o) {bool init_=initialized(); initConstant( o.c_str(), o.size()); setInitialized(init_); return *this;}
315 
317  void init( const char* o, std::size_t len) {bool init_=initialized(); initConstant( o, len); setInitialized(init_);}
318  void init( const char* o) {bool init_=initialized(); initConstant( o, o?std::strlen(o):0); setInitialized(init_);}
319  void init( const std::string& o) {bool init_=initialized(); initConstant( o.c_str(), o.size()); setInitialized(init_);}
320 
322  void clear() {Variant::init();}
323 };
324 
325 }} //namespace
326 
327 namespace std
328 {
330 ostream& operator << (ostream &os, const _Wolframe::types::VariantStruct& o);
331 } //namespace
332 
333 #endif
334 
335 
336 
Type
Type of the variant.
Definition: variant.hpp:70
const VariantStructDescription * description() const
Get the description of a structure (throws for other types than 'Struct')
Definition: variantStruct.hpp:122
int compare(const iterator &o) const
VariantStructConst & operator=(double o)
Definition: variantStruct.hpp:309
boost::uint64_t Timestamp
Timestamp equivalent to a date time value for variant type.
Definition: datetime.hpp:47
VariantStructConst & operator=(unsigned int o)
Definition: variantStruct.hpp:312
pointer to structure
Definition: variantStruct.hpp:77
union _Wolframe::types::Variant::Data::@18 dim
dimension and metadata
Templates describing printing of structures.
iterator & operator++()
Definition: variantStruct.hpp:208
Unresolved indirection.
Definition: variantStruct.hpp:275
const char * typeName() const
Get the type name of 'this' as string constant for logging.
Definition: variant.hpp:98
std::map< const VariantStructDescription *, const VariantStructDescription * > DescriptionAssignmentMap
Definition: variantStruct.hpp:125
bool operator<=(const VariantStruct &o) const
Definition: variantStruct.hpp:111
VariantStruct const * m_itr
Definition: variantStruct.hpp:189
bool operator==(const iterator &o) const
Definition: variantStruct.hpp:201
const VariantStruct * at(std::size_t idx) const
Random access or 0 if no random access defined (throws logic error on ABR/ABW)
void * Ref
reserved for structures (module VariantStruct)
Definition: variant.hpp:120
double Double
floating point value as double precision float
Definition: variant.hpp:113
bool initialized() const
Test if this value is initialized.
Definition: variant.hpp:222
date and time value with a precision down to microseconds
Definition: variant.hpp:74
VariantStructConst(const char *o)
Definition: variantStruct.hpp:299
VariantStructConst & operator=(const char *o)
Definition: variantStruct.hpp:313
VariantStructConst(const std::string &o)
Definition: variantStruct.hpp:301
bool operator<=(const iterator &o) const
Definition: variantStruct.hpp:204
void push()
Add a new element to an array (throws for other types than 'Array')
atomic custom data type
Definition: variantStruct.hpp:67
VariantStructConst(double o)
Definition: variantStruct.hpp:295
VariantStructConst & operator=(int o)
Definition: variantStruct.hpp:311
void initConstCopy(const VariantStruct &o)
Type for representing big numbers as binary coded decimal (BCD) numbers.
Definition: bignumber.hpp:49
Description of a variant structure as array of attributes and content elements.
Definition: variantStructDescription.hpp:57
VariantStructConst(const VariantStructConst &o)
Definition: variantStruct.hpp:293
Structure of variant type atoms or substructures.
Definition: variantStruct.hpp:57
VariantStructConst(const Variant &o)
Definition: variantStruct.hpp:291
atomic signed int
Definition: variantStruct.hpp:71
void init(const char *o, std::size_t len)
Initialization as string constant.
Definition: variantStruct.hpp:317
~VariantStruct()
Destructor.
Definition: variantStruct.hpp:93
iterator operator+(int i) const
Definition: variantStruct.hpp:215
VariantStruct()
Default constructor.
Definition: variantStruct.hpp:85
~VariantStructConst()
Destructor.
Definition: variantStruct.hpp:303
void initConstCopy(const Variant &o)
unresolved indirection
Definition: variantStruct.hpp:78
Const iterator on struct or array elements.
Definition: variantStruct.hpp:164
VariantIndirection(const VariantStructDescription *descr)
Constructor.
VariantUnresolved(const std::string &name_)
Constructor.
void initUnresolved(const std::string &name_)
VariantStructConst & operator=(bool o)
Definition: variantStruct.hpp:308
VariantStructConst(const VariantStruct &o)
Definition: variantStruct.hpp:292
value undefined (NULL)
Definition: variant.hpp:72
ostream & operator<<(ostream &os, const _Wolframe::types::Variant &o)
Output stream operators for logging etc.
bool operator==(const VariantStruct &o) const
Compare structures.
Definition: variantStruct.hpp:107
bool operator>(const VariantStruct &o) const
Definition: variantStruct.hpp:109
VariantStruct(const Variant &o)
Copy constructor.
Definition: variantStruct.hpp:89
VariantStructConst & operator=(const Variant &o)
Assignment operator, keeping the initialization flag of this.
Definition: variantStruct.hpp:306
int compare(const VariantStruct &o) const
null terminated UTF-8 string
Definition: variant.hpp:80
Variant structure that represents a variant structure copy without content ownership.
Definition: variantStruct.hpp:286
VariantStruct * operator->()
Definition: variantStruct.hpp:211
std::size_t size
size of a string - different meaning for structures (module VariantStruct)
Definition: variant.hpp:125
int operator-(const const_iterator &o) const
Definition: variantStruct.hpp:185
VariantStructConst & operator=(const VariantConst &o)
Definition: variantStruct.hpp:307
Structure with info for uniform printing for a type of message (log format as compact one liner...
Definition: printFormats.hpp:45
const VariantStruct & back() const
Get the last element (throws logic error on ABR/ABW)
const VariantStruct & operator*() const
Definition: variantStruct.hpp:183
atomic boolean
Definition: variantStruct.hpp:73
C++ int.
Definition: variant.hpp:77
array of VariantStruct
Definition: variantStruct.hpp:75
VariantStructConst(float o)
Definition: variantStruct.hpp:296
bool operator<(const iterator &o) const
Definition: variantStruct.hpp:203
bool operator>=(const VariantStruct &o) const
Definition: variantStruct.hpp:110
bool operator!=(const const_iterator &o) const
Definition: variantStruct.hpp:173
std::map< std::string, const VariantStructDescription * > ResolveMap
Definition: variantStruct.hpp:60
void init(const char *o)
Definition: variantStruct.hpp:318
bool operator>=(const const_iterator &o) const
Definition: variantStruct.hpp:177
big BCD fixed point number in the range of 1E-32767 to 1E+32768
Definition: variant.hpp:75
iterator(VariantStruct *itr_)
Definition: variantStruct.hpp:196
std::size_t nof_elements() const
Get the number of elements defined (throws for other types than 'Struct' or 'Array') ...
Forward declaration.
Definition: variant.hpp:65
void init(const std::string &o)
Definition: variantStruct.hpp:319
iterator begin()
Definition: variantStruct.hpp:235
VariantStructConst(unsigned int o)
Definition: variantStruct.hpp:298
const_iterator operator+(int i) const
Definition: variantStruct.hpp:186
C++ double.
Definition: variant.hpp:76
void initStruct(const VariantStructDescription *descr)
const_iterator(const const_iterator &o)
Definition: variantStruct.hpp:168
Variant value type that represents a variant copy without content ownership.
Definition: variant.hpp:286
bool operator!=(const iterator &o) const
Definition: variantStruct.hpp:202
VariantStructConst & operator=(float o)
Definition: variantStruct.hpp:310
const void * metadata
unused by base variant type - reserved for structures (module VariantStruct)
Definition: variant.hpp:124
const VariantStruct * prototype() const
Return the prototype element (initialization of new element) of an array (throws for other types than...
Definition: variantStruct.hpp:129
Variant value type.
unsigned char m_type
Definition: variant.hpp:278
void setType(Type type_)
Definition: variantStruct.hpp:247
bool operator>(const iterator &o) const
Definition: variantStruct.hpp:205
iterator operator++(int)
Definition: variantStruct.hpp:209
std::string tostring() const
Getter with value conversion.
atomic double
Definition: variantStruct.hpp:70
Data m_data
Definition: variant.hpp:277
void resolve(const ResolveMap &rmap)
Resolve all unresolved externals according to the given map. Throws, if not all unresolved symbols co...
const_iterator begin() const
Get the an iterator on the first element (direct child)
Definition: variantStruct.hpp:234
bool operator!=(const VariantStruct &o) const
Definition: variantStruct.hpp:108
void makeArray()
Make the structure to be an array with the currently defined value as prototype element.
const VariantStruct & operator[](std::size_t idx) const
Random access (throws logic error on ABR/ABW)
bool operator<(const const_iterator &o) const
Definition: variantStruct.hpp:174
void expandIndirection()
Expands an Indirection (throws for other types than 'Indirection')
const std::string unresolvedName() const
Return the referenced name in case of an unresolved external.
Definition: variantStruct.hpp:133
void clear()
Reseting the content of this.
Definition: variantStruct.hpp:322
void clear()
Reseting the content of this.
Definition: variantStruct.hpp:103
~VariantIndirection()
Definition: variantStruct.hpp:269
undefined value
Definition: variantStruct.hpp:66
bool operator<(const VariantStruct &o) const
Definition: variantStruct.hpp:112
VariantStruct & operator*()
Definition: variantStruct.hpp:212
const_iterator find(const std::string &name_) const
Find an element (direct child)
atomic unsigned int
Definition: variantStruct.hpp:72
C++ bool.
Definition: variant.hpp:79
union _Wolframe::types::Variant::Data::@17 value
value of the variant
VariantStruct(const VariantStruct &o)
Copy constructor.
Definition: variantStruct.hpp:91
void setIndirectionDescription(const DescriptionAssignmentMap &assignmentmap)
VariantStruct * m_itr
Definition: variantStruct.hpp:218
const VariantStruct * select(const std::string &name) const
Get a substructure reference.
const VariantStruct * elementptr(std::size_t idx) const
Random access or 0 if no random access defined or invalid access.
VariantStruct * prototype()
Definition: variantStruct.hpp:130
C++ unsigned int.
Definition: variant.hpp:78
Iterator on struct or array elements.
Definition: variantStruct.hpp:193
const VariantStruct * operator->() const
Definition: variantStruct.hpp:182
bool operator>(const const_iterator &o) const
Definition: variantStruct.hpp:176
const_iterator operator++(int)
Definition: variantStruct.hpp:180
VariantStructConst(int o)
Definition: variantStruct.hpp:297
VariantStructConst(const VariantConst &o)
Constructor.
Definition: variantStruct.hpp:290
_WOLFRAME_UINTEGER UInt
unsigned integer type
Definition: variant.hpp:108
void initConstant(const char *o, std::size_t l)
Initialization as string constant (Constant flag set, data not owned by this)
Type for representing strings in various encodings.
Definition: string.hpp:49
custom data type (types::CustomDataValue)
Definition: variant.hpp:73
void initIndirection(const VariantStructDescription *descr)
content of structure
Definition: variantStruct.hpp:76
void setConstant(bool v=true)
Set the value to be constant.
Definition: variant.hpp:232
bool operator>=(const iterator &o) const
Definition: variantStruct.hpp:206
_WOLFRAME_INTEGER Int
signed integer type
Definition: variant.hpp:107
std::size_t size() const
Get the size of a string.
Definition: variant.hpp:219
Type
Typed filter element type.
Definition: variantStruct.hpp:64
VariantStructConst(bool o)
Definition: variantStruct.hpp:294
static int compareArray(std::size_t size, const VariantStruct *a1, const VariantStruct *a2)
const_iterator find_cis(const std::string &name_) const
Find an element (direct child) with case insensitive comparison (of ascii A-Z)
Variant type as indirection: Variant value is only expanded when referenced.
Definition: variantStruct.hpp:264
const_iterator & operator++()
Definition: variantStruct.hpp:179
VariantStruct & operator=(const VariantStruct &o)
Assignment operator, keeping the initialization flag of this.
Definition: variantStruct.hpp:99
int compare(const const_iterator &o) const
VariantStruct(const VariantStructDescription *d)
Constructor from structure description.
Definition: variantStruct.hpp:87
void print(std::ostream &out, const utils::PrintFormat *pformat, std::size_t level=0) const
Print the value of a structure as string (curly bracket syntax)
bool operator==(const const_iterator &o) const
Definition: variantStruct.hpp:172
bool operator<=(const const_iterator &o) const
Definition: variantStruct.hpp:175
const char * typeName() const
Definition: variantStruct.hpp:82
Type type() const
Get the type of the structure.
Definition: variantStruct.hpp:116
void setInitialized(bool v=true)
Set the value to be initialized.
Definition: variant.hpp:224
void initCopy(const Variant &o)
void setDescription(const VariantStructDescription *descr)
static const char * typeName(Type i)
Get the type name as string constant for logging.
Definition: variantStruct.hpp:81
VariantStructConst & operator=(const std::string &o)
Definition: variantStruct.hpp:314
const_iterator(VariantStruct const *itr_)
Definition: variantStruct.hpp:167
const_iterator end() const
Get the an iterator on the end of the list of elements.
Definition: variantStruct.hpp:237
bool Bool
boolean value
Definition: variant.hpp:112
int operator-(const iterator &o) const
Definition: variantStruct.hpp:214
void initCopy(const VariantStruct &orig)
iterator end()
Definition: variantStruct.hpp:238
iterator(const iterator &o)
Definition: variantStruct.hpp:197
VariantStructConst(const char *o, std::size_t n)
Definition: variantStruct.hpp:300
VariantStruct & operator=(const Variant &o)
Definition: variantStruct.hpp:100