Wolframe, 0.0.3

customDataType.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_CUSTOM_DATA_TYPE_HPP_INCLUDED
36 #define _Wolframe_TYPES_CUSTOM_DATA_TYPE_HPP_INCLUDED
37 #include "types/keymap.hpp"
38 #include <string>
39 #include <vector>
40 #include <cstring>
41 #include <boost/shared_ptr.hpp>
42 
43 namespace _Wolframe {
44 namespace proc
45 {
47  class ProcessorProvider;
48 }
49 namespace types {
50 
52 class Variant;
54 class CustomDataType;
56 class CustomDataInitializer;
58 class DateTime;
60 class BigNumber;
61 
62 
66 {
67 public:
69  :m_type(0),m_initializer(0){}
72  virtual ~CustomDataValue(){};
73 
74  const CustomDataType* type() const {return m_type;}
76 
77  virtual int compare( const CustomDataValue& o) const=0;
78  virtual std::string tostring() const=0;
79  virtual void assign( const Variant& o)=0;
80  virtual CustomDataValue* copy() const=0;
81  virtual bool getBaseTypeValue( Variant&) const {return false;}
82 
83 private:
84  friend class CustomDataType;
87 };
88 
89 typedef boost::shared_ptr<CustomDataValue> CustomDataValueR;
90 
91 
95 {
96 public:
99 };
100 
101 typedef boost::shared_ptr<CustomDataInitializer> CustomDataInitializerR;
102 
106 {
107 public:
108  typedef unsigned int ID;
112  {
113  static const char* ar[] = {"increment","decrement","negation"};
114  return ar[(int)i];
115  }
119  {
120  static const char* ar[] = {"add","subtract","multiply","divide","power","concat"};
121  return ar[(int)i];
122  }
126  {
127  static const char* ar[] = {"tostring","toint","touint","todouble","totimestamp"};
128  return ar[(int)i];
129  }
133  {
134  static const char* ar[] = {"length"};
135  return ar[(int)i];
136  }
137 
138  typedef types::Variant (*ConversionOperator)( const CustomDataValue& operand);
139  typedef types::Variant (*UnaryOperator)( const CustomDataValue& operand);
140  typedef types::Variant (*BinaryOperator)( const CustomDataValue& operand, const Variant& arg);
141  typedef std::size_t (*DimensionOperator)( const CustomDataValue& arg);
142  typedef CustomDataInitializer* (*CreateCustomDataInitializer)( const std::vector<types::Variant>& arg);
143  typedef CustomDataValue* (*CustomDataValueConstructor)( const CustomDataInitializer* initializer);
144  typedef types::Variant (*CustomDataValueMethod)( const CustomDataValue& val, const std::vector<types::Variant>& arg);
145 
146 public:
149  :m_id(0)
150  {
151  std::memset( &m_vmt, 0, sizeof( m_vmt));
152  }
153 
158  CustomDataType( const std::string& name_,
159  CustomDataValueConstructor constructor_,
160  CreateCustomDataInitializer initializerconstructor_=0);
161 
163  CustomDataType( const CustomDataType& o);
164 
165  void define( UnaryOperatorType type, UnaryOperator op);
166  void define( BinaryOperatorType type, BinaryOperator op);
169  void define( const char* methodname, CustomDataValueMethod method);
170 
175  CustomDataValueMethod getMethod( const std::string& methodname) const;
176 
177  CustomDataInitializer* createInitializer( const std::vector<types::Variant>& arg) const;
179 
180  bool hasInitializer() const {return !!m_vmt.opInitializerConstructor;}
181  const ID& id() const {return m_id;}
182  const std::string& name() const {return m_name;}
183 
184 private:
185  std::string m_name;
188 
189  struct
190  {
197  }
198  m_vmt;
200 };
201 
202 typedef boost::shared_ptr<CustomDataType> CustomDataTypeR;
203 
204 
205 typedef CustomDataType* (*CreateCustomDataType)( const std::string& name);
206 
207 
208 }}//namespace
209 #endif
static const char * conversionOperatorTypeName(ConversionOperatorType i)
Definition: customDataType.hpp:125
CustomDataInitializer * createInitializer(const std::vector< types::Variant > &arg) const
Definition: customDataType.hpp:109
types::keymap< CustomDataValueMethod > m_methodmap
Definition: customDataType.hpp:199
Definition: customDataType.hpp:110
CustomDataValue * createValue(const CustomDataInitializer *i=0) const
static const char * dimensionOperatorTypeName(DimensionOperatorType i)
Definition: customDataType.hpp:132
Definition: customDataType.hpp:124
DimensionOperator opDimension[NofDimensionOperators]
Definition: customDataType.hpp:193
virtual bool getBaseTypeValue(Variant &) const
Definition: customDataType.hpp:81
CustomDataInitializer()
Definition: customDataType.hpp:97
Initializer for a custom data value.
Definition: customDataType.hpp:94
ConversionOperator opConversion[NofConversionOperators]
Definition: customDataType.hpp:194
ConversionOperator getOperator(ConversionOperatorType type) const
CustomDataInitializer *(* CreateCustomDataInitializer)(const std::vector< types::Variant > &arg)
Definition: customDataType.hpp:142
DimensionOperatorType
Definition: customDataType.hpp:131
ConversionOperatorType
Definition: customDataType.hpp:124
types::Variant(* CustomDataValueMethod)(const CustomDataValue &val, const std::vector< types::Variant > &arg)
Definition: customDataType.hpp:144
CustomDataValueMethod getMethod(const std::string &methodname) const
std::string m_name
Definition: customDataType.hpp:185
Definition: customDataType.hpp:117
CustomDataValue()
Definition: customDataType.hpp:68
const ID & id() const
Definition: customDataType.hpp:181
Custom data value.
Definition: customDataType.hpp:65
boost::shared_ptr< CustomDataType > CustomDataTypeR
Definition: customDataType.hpp:202
const CustomDataType * type() const
Definition: customDataType.hpp:74
boost::shared_ptr< CustomDataValue > CustomDataValueR
Definition: customDataType.hpp:89
Definition: customDataType.hpp:117
BinaryOperator opBinary[NofBinaryOperators]
Definition: customDataType.hpp:192
std::size_t(* DimensionOperator)(const CustomDataValue &arg)
Definition: customDataType.hpp:141
CustomDataType()
Default constructor.
Definition: customDataType.hpp:148
const std::string & name() const
Definition: customDataType.hpp:182
Forward declaration.
Definition: variant.hpp:65
CustomDataValue(const CustomDataValue &o)
Definition: customDataType.hpp:70
static const char * unaryOperatorTypeName(UnaryOperatorType i)
Definition: customDataType.hpp:111
Definition: customDataType.hpp:110
bool hasInitializer() const
Definition: customDataType.hpp:180
CustomDataValue *(* CustomDataValueConstructor)(const CustomDataInitializer *initializer)
Definition: customDataType.hpp:143
Definition: customDataType.hpp:124
CustomDataValueConstructor opConstructor
Definition: customDataType.hpp:196
const CustomDataInitializer * initializer() const
Definition: customDataType.hpp:75
Processor provider, the class that provides access to configured global objects to processors...
Definition: procProvider.hpp:61
void define(UnaryOperatorType type, UnaryOperator op)
UnaryOperatorType
Definition: customDataType.hpp:110
Definition: customDataType.hpp:117
Definition: customDataType.hpp:124
BinaryOperatorType
Definition: customDataType.hpp:117
unsigned int ID
Definition: customDataType.hpp:108
struct _Wolframe::types::CustomDataType::@16 m_vmt
Custom Data Type Definition.
Definition: customDataType.hpp:105
template for map with case insensitive key strings
virtual ~CustomDataInitializer()
Definition: customDataType.hpp:98
Definition: customDataType.hpp:124
static const char * binaryOperatorTypeName(BinaryOperatorType i)
Definition: customDataType.hpp:118
types::Variant(* BinaryOperator)(const CustomDataValue &operand, const Variant &arg)
Definition: customDataType.hpp:140
Definition: customDataType.hpp:117
Definition: customDataType.hpp:117
const CustomDataInitializer * m_initializer
Definition: customDataType.hpp:86
virtual int compare(const CustomDataValue &o) const =0
virtual void assign(const Variant &o)=0
Definition: customDataType.hpp:110
Definition: customDataType.hpp:117
boost::shared_ptr< CustomDataInitializer > CustomDataInitializerR
Definition: customDataType.hpp:101
types::Variant(* UnaryOperator)(const CustomDataValue &operand)
Definition: customDataType.hpp:139
virtual ~CustomDataValue()
Definition: customDataType.hpp:72
virtual CustomDataValue * copy() const =0
Definition: customDataType.hpp:131
Definition: customDataType.hpp:124
types::Variant(* ConversionOperator)(const CustomDataValue &operand)
Definition: customDataType.hpp:138
ID m_id
Definition: customDataType.hpp:187
virtual std::string tostring() const =0
CreateCustomDataInitializer opInitializerConstructor
Definition: customDataType.hpp:195
UnaryOperator opUnary[NofUnaryOperators]
Definition: customDataType.hpp:191
const CustomDataType * m_type
Definition: customDataType.hpp:85