PEBL 2.2
Psychology Experiment Building Language - Cross-platform psychological experiment development system
Variant.h
Go to the documentation of this file.
1//* -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*- */
3// Name: src/base/Variant.h
4// Purpose: Contains the Variant Class
5// Author: Shane T. Mueller, Ph.D.
6// Copyright: (c) 2003--2018 Shane T. Mueller <smueller@obereed.net>
7// License: GPL 2
8//
9//
10//
11// This file is part of the PEBL project.
12//
13// PEBL is free software; you can redistribute it and/or modify
14// it under the terms of the GNU General Public License as published by
15// the Free Software Foundation; either version 2 of the License, or
16// (at your option) any later version.
17//
18// PEBL is distributed in the hope that it will be useful,
19// but WITHOUT ANY WARRANTY; without even the implied warranty of
20// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21// GNU General Public License for more details.
22//
23// You should have received a copy of the GNU General Public License
24// along with PEBL; if not, write to the Free Software
25// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27#ifndef __VARIANT_H__
28#define __VARIANT_H__
29
30//#include "PComplexData.h"
31
32#include <iostream>
33#include "../utility/PEBLUtility.h"
34#include "../utility/rc_ptrs.h"
35#include "../utility/Defs.h"
36
37class PComplexData;
38class Variant;
39
41 P_DATA_UNDEFINED = 0, // undefined, error
42 P_DATA_STACK_SIGNAL, // an enum that signals stuff to the evaluator stack, for internal use only.
43 P_DATA_FUNCTION, // the name of a function.
44 P_DATA_FUNCTION_POINTER, // A pointer to a function. Used for compiled library functions.
45 P_DATA_NUMBER_INTEGER, // an integer
47 P_DATA_STRING, // a string of characters
48 P_DATA_LOCALVARIABLE, // a 'variable'; i.e. a char* symbolizing another piece of data.
49 P_DATA_GLOBALVARIABLE, // a 'variable'; i.e. a char* symbolizing another piece of data.
50 P_DATA_COMPLEXDATA // Any one of a number of complex data 'objects'.
51};
52
53
61
62
63//Defines pFunc to be the function-pointer type
65
67{
68public:
69
70 Variant();
72
73 Variant(const pInt i);
74#ifndef PEBL_EMSCRIPTEN
75 Variant(int i);
76#endif
77
78 Variant(const long unsigned int i);
80#ifndef PEBL_EMSCRIPTEN
81 Variant(const double f);
82#endif
83 Variant(float f);
84
85
86 Variant(const char* mystring);
87 Variant(const char character);
88 Variant(const char* mystring, VariantDataType type);
90 Variant(pFunc); //This one takes a function-pointer as an argument.
91 Variant(const PComplexData * pcd);
92 Variant(bool b);
93 Variant(const std::string s);
94
96 ~Variant();
97
98
100 Variant(const Variant &v);
101
102
103 //Overload the standard operators
104 Variant operator + (const Variant & rhs) const;
105 Variant operator - (const Variant & rhs) const;
106 Variant operator * (const Variant & rhs) const;
107 Variant operator / (const Variant & rhs) const;
108
109
110 //Primitive Comparators
111 bool Equal(const Variant & rhs) const;
112 bool Less (const Variant & rhs) const;
113
114 //Comparison Operators
115 bool operator < (const Variant & rhs) const;
116 bool operator > (const Variant & rhs) const;
117 bool operator <= (const Variant & rhs) const;
118 bool operator >= (const Variant & rhs) const;
119 bool operator == (const Variant & rhs) const;
120 bool operator != (const Variant & rhs) const;
121
122 //Assignment Operators
123 Variant operator = (const Variant & value);
124 Variant operator = (const pDouble & value);
125 Variant operator = (const pInt & value);
126 Variant operator = (const long unsigned int & value);
127
128#ifndef PEBL_EMSCRIPTEN
129 Variant operator = (const int & value);
130 Variant operator = (const double & value);
131#endif
132
133 Variant operator = (const float & value);
134 Variant operator = (const char * value);
135 Variant operator = (const std::string value);
136
137 //Overload of the << operator
138 friend std::ostream& operator<<(std::ostream& out, const Variant& v);
139
141 operator pDouble();
142 operator pInt();
143 operator long unsigned int();
144
145#ifndef PEBL_EMSCRIPTEN
146 operator int();
147 // operator const char*();
148#endif
149
150 operator const std::string() const;
151 //operator char*();
152 operator bool();
153
155 std::string GetDataTypeName() const;
156
157 bool IsNumber() const;
158 bool IsFloat() const;
159 bool IsInteger() const;
160 bool IsVariable() const;
161 bool IsLocalVariable() const;
162 bool IsGlobalVariable() const;
163 bool IsString() const;
164 bool IsFunction() const;
165 bool IsFunctionPointer() const;
166 bool IsComplexData() const;
167 bool IsStackSignal() const;
168
169 pInt GetInteger() const;
170 pDouble GetFloat() const;
171 std::string GetVariableName() const;
172 std::string GetVariableBaseName() const;
173 std::string GetVariablePropertyName() const;
174
175 std::string GetFunctionName() const;
176 std::string GetString() const;
178 Variant GetSignalName()const;
181
182 void SetComplexData(PComplexData * data); //Set and retrieve something in the complex data slot.
183
184 void SetCreationTime(long unsigned int time){mCreationTime = time;};
185 long unsigned int GetCreationTime()const{return mCreationTime;} ;
186
187protected:
188 void free_mData();
189private:
190
191 // Put mDataType first to ensure it's always at offset 0
192 VariantDataType mDataType; // number, string or array
193
199
201 PComplexData * mComplexData;
202
203 union PValue {
204 pInt iNumber;
205 pDouble fNumber; /* number */
206 char * String;
207 char * Variable; /* The name of a variable */
208 char * Function;
209 Variant (*pFunction)(Variant);
210 StackSignalType Signal; /*A signal type used by Evaluator stack.*/
211 } mData;
212
213 long unsigned int mCreationTime;
214
215};
216
217
218#endif
#define pInt
Definition Defs.h:8
#define pDouble
Definition Defs.h:7
VariantDataType
Definition Variant.h:40
@ P_DATA_UNDEFINED
Definition Variant.h:41
@ P_DATA_LOCALVARIABLE
Definition Variant.h:48
@ P_DATA_STACK_SIGNAL
Definition Variant.h:42
@ P_DATA_FUNCTION_POINTER
Definition Variant.h:44
@ P_DATA_STRING
Definition Variant.h:47
@ P_DATA_COMPLEXDATA
Definition Variant.h:50
@ P_DATA_NUMBER_INTEGER
Definition Variant.h:45
@ P_DATA_NUMBER_FLOAT
Definition Variant.h:46
@ P_DATA_FUNCTION
Definition Variant.h:43
@ P_DATA_GLOBALVARIABLE
Definition Variant.h:49
StackSignalType
Definition Variant.h:54
@ STACK_UNDEFINED
Definition Variant.h:55
@ STACK_LIST_HEAD
Definition Variant.h:56
@ STACK_BREAK
Definition Variant.h:59
@ STACK_TERMINATE_EVENT_LOOP
Definition Variant.h:58
@ STACK_RETURN_DUMMY
Definition Variant.h:57
Variant(* pFunc)(Variant)
Definition Variant.h:64
Variant operator/(const Variant &rhs) const
This overloads the / operator for Variants.
Definition Variant.cpp:469
bool IsComplexData() const
Definition Variant.cpp:984
pInt GetInteger() const
Definition Variant.cpp:997
bool Less(const Variant &rhs) const
Primitive Comparing Method.
Definition Variant.cpp:543
bool operator!=(const Variant &rhs) const
Definition Variant.cpp:581
bool IsGlobalVariable() const
Definition Variant.cpp:964
std::string GetVariablePropertyName() const
Definition Variant.cpp:1185
bool Equal(const Variant &rhs) const
Definition Variant.cpp:491
friend std::ostream & operator<<(std::ostream &out, const Variant &v)
void SetCreationTime(long unsigned int time)
Definition Variant.h:184
long unsigned int GetCreationTime() const
Definition Variant.h:185
Variant operator-(const Variant &rhs) const
This overloads the - operator for Variants.
Definition Variant.cpp:418
bool IsString() const
Definition Variant.cpp:948
pFunc GetFunctionPointer() const
Definition Variant.cpp:1280
bool IsStackSignal() const
Definition Variant.cpp:989
Variant operator=(const Variant &value)
Assignment Operator (overloaded)
Definition Variant.cpp:610
void free_mData()
Definition Variant.cpp:1320
bool IsFunctionPointer() const
Definition Variant.cpp:976
bool operator<=(const Variant &rhs) const
Definition Variant.cpp:596
bool IsFunction() const
Definition Variant.cpp:970
bool IsFloat() const
Definition Variant.cpp:937
std::string GetVariableName() const
Definition Variant.cpp:1138
bool operator>(const Variant &rhs) const
Definition Variant.cpp:591
std::string GetString() const
Definition Variant.cpp:1056
bool IsVariable() const
Definition Variant.cpp:954
bool IsInteger() const
Definition Variant.cpp:942
StackSignalType GetSignal() const
Definition Variant.cpp:1265
bool operator==(const Variant &rhs) const
Definition Variant.cpp:576
PComplexData * GetComplexData() const
Definition Variant.cpp:1299
pDouble GetFloat() const
Definition Variant.cpp:1025
bool IsNumber() const
This tests whether the Variant is a number (i.e., a float or an integer.)
Definition Variant.cpp:930
void SetComplexData(PComplexData *data)
Definition Variant.cpp:1309
Variant GetSignalName() const
Definition Variant.cpp:1236
bool IsLocalVariable() const
Definition Variant.cpp:959
Variant operator*(const Variant &rhs) const
This overloads the * operator for Variants.
Definition Variant.cpp:444
std::string GetDataTypeName() const
This returns the type as a string.
Definition Variant.cpp:891
bool operator>=(const Variant &rhs) const
Definition Variant.cpp:601
std::string GetVariableBaseName() const
Definition Variant.cpp:1160
bool operator<(const Variant &rhs) const
Definition Variant.cpp:586
std::string GetFunctionName() const
Definition Variant.cpp:1208
VariantDataType GetDataType() const
This returns the type as an enum.
Definition Variant.cpp:885
Variant()
Definition Variant.cpp:58
Variant operator+(const Variant &rhs) const
Definition Variant.cpp:386
~Variant()
Standard Destructor.
Definition Variant.cpp:376