Wolframe, 0.0.3

variantStructDescription.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_DESCRIPTION_HPP_INCLUDED
36 #define _Wolframe_TYPES_VARIANT_STRUCT_DESCRIPTION_HPP_INCLUDED
37 #include "types/variant.hpp"
39 #include <string>
40 #include <map>
41 #include <iostream>
42 #include <stdexcept>
43 #include <boost/shared_ptr.hpp>
44 
45 namespace _Wolframe {
46 namespace utils {
48  struct PrintFormat;
49 }
50 namespace types {
51 
53 class VariantStruct;
54 
58 {
59 public:
60  typedef std::map<std::string,const VariantStructDescription*> ResolveMap;
61 
68 
70  struct Element
71  {
72  char* name;
76 
78  enum Flags
79  {
80  NoFlags=0x0,
81  Optional=0x1,
82  Mandatory=0x2,
83  Attribute=0x4,
84  Array=0x8
85  };
86  unsigned char flags;
87 
88  bool optional() const {return (flags & (unsigned char)Optional) != 0;}
89  bool mandatory() const {return (flags & (unsigned char)Mandatory) != 0;}
90  bool attribute() const {return (flags & (unsigned char)Attribute) != 0;}
91  bool array() const {return (flags & (unsigned char)Array) != 0;}
92 
93  void setOptional( bool v=true) {if (v) flags |= (unsigned char)Optional; else flags -= (flags & (unsigned char)Optional);}
94  void setMandatory( bool v=true) {if (v) flags |= (unsigned char)Mandatory; else flags -= (flags & (unsigned char)Mandatory);}
95  void setAttribute( bool v=true) {if (v) flags |= (unsigned char)Attribute; else flags -= (flags & (unsigned char)Attribute);}
96 
97  Variant::Type type() const;
98  void makeArray();
99  void copy( const Element& o);
100  };
101 
104  {
105  public:
106  const_iterator( Element const* itr_) :m_itr(itr_){}
108 
109  int compare( const const_iterator& o) const;
110 
111  bool operator==( const const_iterator& o) const {return compare(o) == 0;}
112  bool operator!=( const const_iterator& o) const {return compare(o) != 0;}
113  bool operator<( const const_iterator& o) const {return compare(o) < 0;}
114  bool operator<=( const const_iterator& o) const {return compare(o) <= 0;}
115  bool operator>( const const_iterator& o) const {return compare(o) > 0;}
116  bool operator>=( const const_iterator& o) const {return compare(o) >= 0;}
117 
118  const_iterator& operator++() {++m_itr; return *this;}
119  const_iterator operator++(int) {const_iterator rt(*this); ++m_itr; return rt;}
120 
121  const Element* operator->() const {return m_itr;}
122  const Element& operator*() const {return *m_itr;}
123 
124  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;}
125  const_iterator operator + (int i) const {if (!m_itr) throw std::logic_error("illegal operation"); return m_itr + i;}
126 
127  private:
128  Element const* m_itr;
129  };
130 
132  class iterator
133  {
134  public:
135  iterator( Element* itr_) :m_itr(itr_){}
136  iterator( const iterator& o) :m_itr(o.m_itr){}
137 
138  int compare( const iterator& o) const;
139 
140  bool operator==( const iterator& o) const {return compare(o) == 0;}
141  bool operator!=( const iterator& o) const {return compare(o) != 0;}
142  bool operator<( const iterator& o) const {return compare(o) < 0;}
143  bool operator<=( const iterator& o) const {return compare(o) <= 0;}
144  bool operator>( const iterator& o) const {return compare(o) > 0;}
145  bool operator>=( const iterator& o) const {return compare(o) >= 0;}
146 
147  iterator& operator++() {++m_itr; return *this;}
148  iterator operator++(int) {iterator rt(*this); ++m_itr; return rt;}
149 
150  Element* operator->() {return m_itr;}
151  Element& operator*() {return *m_itr;}
152 
153  int operator - (const iterator& o) const {if (!o.m_itr || !m_itr) throw std::logic_error("illegal operation"); return m_itr - o.m_itr;}
154  iterator operator + (int i) const {if (!m_itr) throw std::logic_error("illegal operation"); return m_itr + i;}
155 
156  private:
158  };
159 
160 public:
162  const Element* at( std::size_t idx) const {if (idx>=m_size) return 0; else return m_ar+idx;}
163  Element* at( std::size_t idx) {if (idx>=m_size) return 0; else return m_ar+idx;}
164 
166  const Element& back() const {if (m_size==0) throw std::logic_error("array bound read"); return m_ar[ m_size-1];}
167  Element& back() {if (m_size==0) throw std::logic_error("array bound write"); return m_ar[ m_size-1];}
168 
170  const_iterator begin() const {return beginptr();}
171  iterator begin() {return beginptr();}
173  const_iterator end() const {return endptr();}
174  iterator end() {return endptr();}
175 
181  int addAttribute( const std::string& name, const Variant& initvalue, const NormalizeFunction* normalizer=0);
187  int addAtom( const std::string& name, const Variant& initvalue, const NormalizeFunction* normalizer=0);
192  int addStructure( const std::string& name, const VariantStructDescription& substruct);
197  int addIndirection( const std::string& name_, const VariantStructDescription* descr);
202  int addUnresolved( const std::string& name_, const std::string& symbol_);
206  int addElement( const Element& elem);
209  void inherit( const VariantStructDescription& parent);
212  void resolve( const ResolveMap& rmap);
213 
217  int findidx( const std::string& name_) const;
221  const_iterator find( const std::string& name_) const;
225  iterator find( const std::string& name_);
226 
230  int findidx_cis( const std::string& name_) const;
234  const_iterator find_cis( const std::string& name_) const;
238  iterator find_cis( const std::string& name_);
239 
242  std::size_t size() const {return m_size;}
243 
245  int compare( const VariantStructDescription& o) const;
247  std::string names( const std::string& sep) const;
248 
250  void print( std::ostream& out, const utils::PrintFormat* pformat, std::size_t level) const;
251 
253  std::string tostring( const utils::PrintFormat* pformat=0) const;
254 
255  void check() const;
256 
257 private:
258  const Element* beginptr() const {return m_ar;}
259  Element* beginptr() {return m_ar;}
260  const Element* endptr() const {return m_ar+m_size;}
261  Element* endptr() {return m_ar+m_size;}
262 
263 private:
264  std::size_t m_size;
265  std::size_t m_nofattributes;
267 };
268 
269 typedef boost::shared_ptr<VariantStructDescription> VariantStructDescriptionR;
270 
271 }} //namespace
272 #endif
273 
274 
Definition: variantStructDescription.hpp:80
Type
Type of the variant.
Definition: variant.hpp:70
Element const * m_itr
Definition: variantStructDescription.hpp:128
< element is an attribute
Definition: variantStructDescription.hpp:84
iterator & operator++()
Definition: variantStructDescription.hpp:147
< no flags set
Definition: variantStructDescription.hpp:81
const Element * operator->() const
Definition: variantStructDescription.hpp:121
bool mandatory() const
Definition: variantStructDescription.hpp:89
Element * operator->()
Definition: variantStructDescription.hpp:150
void setMandatory(bool v=true)
Definition: variantStructDescription.hpp:94
const Element & back() const
Get the last element (throws logic error on ABR/ABW)
Definition: variantStructDescription.hpp:166
Normalize function definition.
< element is an mandatory
Definition: variantStructDescription.hpp:83
iterator operator++(int)
Definition: variantStructDescription.hpp:148
Element & back()
Definition: variantStructDescription.hpp:167
int addUnresolved(const std::string &name_, const std::string &symbol_)
Add an unresolved indirection definition to the structure description (an indirection is a element ex...
std::size_t m_nofattributes
Definition: variantStructDescription.hpp:265
boost::shared_ptr< VariantStructDescription > VariantStructDescriptionR
Definition: variantStructDescription.hpp:269
Description of a variant structure as array of attributes and content elements.
Definition: variantStructDescription.hpp:57
Structure of variant type atoms or substructures.
Definition: variantStruct.hpp:57
bool operator>=(const const_iterator &o) const
Definition: variantStructDescription.hpp:116
bool optional() const
< internal representation of the flags of this element
Definition: variantStructDescription.hpp:88
bool operator!=(const const_iterator &o) const
Definition: variantStructDescription.hpp:112
VariantStruct * initvalue
Definition: variantStructDescription.hpp:73
void print(std::ostream &out, const utils::PrintFormat *pformat, std::size_t level) const
Print the contents of a structure description (structures in curly brackets as in the simpleform lang...
const Element * at(std::size_t idx) const
Random access or 0 if no random access defined (throws logic error on ABR/ABW)
Definition: variantStructDescription.hpp:162
Element * m_ar
Definition: variantStructDescription.hpp:266
std::size_t m_size
Definition: variantStructDescription.hpp:264
std::string names(const std::string &sep) const
Get the list of names as string with 'sep' as separator for logging.
int addElement(const Element &elem)
Add an element copy to the structure description.
int addIndirection(const std::string &name_, const VariantStructDescription *descr)
Add an indirection definition to the structure description (an indirection is a element expanded on a...
void setOptional(bool v=true)
Definition: variantStructDescription.hpp:93
bool operator==(const iterator &o) const
Definition: variantStructDescription.hpp:140
bool operator>=(const iterator &o) const
Definition: variantStructDescription.hpp:145
iterator end()
Definition: variantStructDescription.hpp:174
bool array() const
Definition: variantStructDescription.hpp:91
One element of the structure description. Refers to the element with the same index in the correspond...
Definition: variantStructDescription.hpp:70
const_iterator operator+(int i) const
Definition: variantStructDescription.hpp:125
std::string tostring(const utils::PrintFormat *pformat=0) const
Return the contents of a structure description as string (format as in print with no indent and newli...
Structure with info for uniform printing for a type of message (log format as compact one liner...
Definition: printFormats.hpp:45
const_iterator(const const_iterator &o)
Definition: variantStructDescription.hpp:107
Element & operator*()
Definition: variantStructDescription.hpp:151
iterator operator+(int i) const
Definition: variantStructDescription.hpp:154
bool operator>(const const_iterator &o) const
Definition: variantStructDescription.hpp:115
const Element & operator*() const
Definition: variantStructDescription.hpp:122
const_iterator find_cis(const std::string &name_) const
Find an element by name with case insensitive comparison (of ascii A-Z) in the structure description...
Basic normalization function for atomic values (variant type)
Definition: normalizeFunction.hpp:52
void setAttribute(bool v=true)
Definition: variantStructDescription.hpp:95
Forward declaration.
Definition: variant.hpp:65
const NormalizeFunction * normalizer
< substructure in case of an element that is itself a structure
Definition: variantStructDescription.hpp:75
Element * beginptr()
Definition: variantStructDescription.hpp:259
bool operator<(const const_iterator &o) const
Definition: variantStructDescription.hpp:113
Variant value type.
int compare(const VariantStructDescription &o) const
Compare two structure descriptions element by element (recursively)
const Element * beginptr() const
Definition: variantStructDescription.hpp:258
const_iterator begin() const
Get the an iterator on the first element (direct child)
Definition: variantStructDescription.hpp:170
const Element * endptr() const
Definition: variantStructDescription.hpp:260
const_iterator(Element const *itr_)
Definition: variantStructDescription.hpp:106
const_iterator end() const
Get the an iterator on the end of the list of elements.
Definition: variantStructDescription.hpp:173
bool operator!=(const iterator &o) const
Definition: variantStructDescription.hpp:141
bool operator<(const iterator &o) const
Definition: variantStructDescription.hpp:142
Element * m_itr
Definition: variantStructDescription.hpp:157
Iterator on the elements of the definition.
Definition: variantStructDescription.hpp:132
< element is an optional
Definition: variantStructDescription.hpp:82
Element * endptr()
Definition: variantStructDescription.hpp:261
bool operator<=(const iterator &o) const
Definition: variantStructDescription.hpp:143
Flags
< normalizer function for an atomic element. Can be null also for an atomic element if not defined ...
Definition: variantStructDescription.hpp:78
char * name
name of the element in UTF-8
Definition: variantStructDescription.hpp:72
VariantStructDescription * substruct
< initialization value of the element
Definition: variantStructDescription.hpp:74
int operator-(const const_iterator &o) const
Definition: variantStructDescription.hpp:124
bool attribute() const
Definition: variantStructDescription.hpp:90
bool operator>(const iterator &o) const
Definition: variantStructDescription.hpp:144
iterator begin()
Definition: variantStructDescription.hpp:171
const_iterator operator++(int)
Definition: variantStructDescription.hpp:119
void resolve(const ResolveMap &rmap)
Resolve all unresolved externals in intialzation values according to the given map. Throws, if not all unresolved symbols could be resolved !
unsigned char flags
Definition: variantStructDescription.hpp:86
int operator-(const iterator &o) const
Definition: variantStructDescription.hpp:153
const_iterator find(const std::string &name_) const
Find an element by name in the structure description.
int addStructure(const std::string &name, const VariantStructDescription &substruct)
Add a substructure definition to the structure description.
void inherit(const VariantStructDescription &parent)
Inherit the elements from another structure description.
std::size_t size() const
Get the number of elements in the structure description.
Definition: variantStructDescription.hpp:242
Element * at(std::size_t idx)
Definition: variantStructDescription.hpp:163
iterator(const iterator &o)
Definition: variantStructDescription.hpp:136
bool operator==(const const_iterator &o) const
Definition: variantStructDescription.hpp:111
Const iterator on the elements of the definition.
Definition: variantStructDescription.hpp:103
iterator(Element *itr_)
Definition: variantStructDescription.hpp:135
int findidx_cis(const std::string &name_) const
Find an element by name with case insensitive comparison (of ascii A-Z) in the structure description...
int addAttribute(const std::string &name, const Variant &initvalue, const NormalizeFunction *normalizer=0)
Add an attribute definition to the structure description.
int addAtom(const std::string &name, const Variant &initvalue, const NormalizeFunction *normalizer=0)
Add an atomic element definition to the structure description.
bool operator<=(const const_iterator &o) const
Definition: variantStructDescription.hpp:114
int findidx(const std::string &name_) const
Find an element by name in the structure description.
std::map< std::string, const VariantStructDescription * > ResolveMap
Definition: variantStructDescription.hpp:60
const_iterator & operator++()
Definition: variantStructDescription.hpp:118