2 #include "Reflex/Object.h"
3 #include <Reflex/Builder/NewDelFunctions.h>
7 using namespace Reflex;
11 methods_(methods), retType_(retType) {
16 methods_(other.methods_), retType_(other.retType_) {
21 for(std::vector<Reflex::Object>::iterator it =
objects_.begin(); it !=
objects_.end(); ++it) {
29 if (obj.Address() != 0) {
30 if (obj.TypeOf().IsPointer() || obj.TypeOf().IsReference()) {
32 void **
p =
static_cast<void **
>(obj.Address());
36 obj.TypeOf().Deallocate(obj.Address());
43 std::vector<MethodInvoker>::const_iterator it =
methods_.begin(), ed =
methods_.end();
44 std::vector<Reflex::Object>::iterator itobj =
objects_.begin();
45 for (; it != ed; ++it, ++itobj) {
53 static Type tVoid = Type::ByName(
"void");
54 if (member.IsFunctionMember()) {
58 retType = retType.FinalType();
59 if (retType == tVoid) {
60 obj = Reflex::Object(tVoid);
61 }
else if (retType.IsPointer() || retType.IsReference()) {
63 obj = Reflex::Object(retType,
new void *);
65 obj = Reflex::Object(retType, retType.Allocate());
66 ret = retType.IsClass();
70 obj = Reflex::Object();
101 std::vector<MethodInvoker>::const_iterator itm,
end =
methods_.end();
102 std::vector<Reflex::Object>::iterator ito;
104 ro = itm->invoke(ro, *ito);
107 std::vector<Reflex::Object>::reverse_iterator rito, rend =
objects_.rend();;
108 std::vector<bool>::const_reverse_iterator ritb;
110 if (*ritb) rito->TypeOf().Destruct(rito->Address(),
false);
118 void * addr = obj.Address();
121 case(
doubleType) :
ret = *
static_cast<double *
>(addr);
break;
122 case(
floatType ) :
ret = *
static_cast<float *
>(addr);
break;
123 case(
intType ) :
ret = *
static_cast<int *
>(addr);
break;
124 case(
uIntType ) :
ret = *
static_cast<unsigned int *
>(addr);
break;
125 case(
shortType ) :
ret = *
static_cast<short *
>(addr);
break;
126 case(
uShortType) :
ret = *
static_cast<unsigned short *
>(addr);
break;
127 case(
longType ) :
ret = *
static_cast<long *
>(addr);
break;
128 case(
uLongType ) :
ret = *
static_cast<unsigned long *
>(addr);
break;
129 case(
charType ) :
ret = *
static_cast<char *
>(addr);
break;
130 case(
uCharType ) :
ret = *
static_cast<unsigned char *
>(addr);
break;
131 case(
boolType ) :
ret = *
static_cast<bool *
>(addr);
break;
132 case(
enumType ) :
ret = *
static_cast<int *
>(addr);
break;
140 static std::map<void *, Reflex::NewDelFunctions *> deleters_;
141 void * reflexTypeId = obj.TypeOf().Id();
142 std::map<void *, Reflex::NewDelFunctions *>::iterator
match = deleters_.find(reflexTypeId);
143 if (match == deleters_.end()) {
144 Reflex::NewDelFunctions *ptr;
145 Reflex::Object newDel(Reflex::Type::ByTypeInfo(
typeid(ptr)), &ptr);
146 obj.Invoke(
"__getNewDelFunctions", &newDel);
147 match = deleters_.insert(std::make_pair(reflexTypeId, ptr)).first;
149 (*match->second->fDelete)(obj.Address());
163 std::vector<LazyInvoker>::const_iterator it, ed =
methods_.end()-1;
164 Reflex::Object ro =
o;
165 for (it =
methods_.begin(); it < ed; ++it) {
169 std::vector<Reflex::Object>::reverse_iterator rit,
red =
objects_.rend();
171 rit->TypeOf().Destruct(rit->Address(),
false);
ExpressionLazyVar(const std::vector< LazyInvoker > &methods)
virtual double value(const Reflex::Object &o) const
std::vector< Reflex::Object > objects_
static void delStorage(Reflex::Object &obj)
std::vector< LazyInvoker > methods_
ExpressionVar(const std::vector< MethodInvoker > &methods, method::TypeCode retType)
std::vector< bool > needsDestructor_
static bool isValidReturnType(method::TypeCode)
std::vector< Reflex::Object > objects_
static void trueDelete(Reflex::Object &o)
virtual double value(const Reflex::Object &o) const
std::vector< MethodInvoker > methods_
static bool makeStorage(Reflex::Object &obj, const Reflex::Member &member)
static double objToDouble(const Reflex::Object &obj, method::TypeCode type)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Evaluate an object's method or datamember (or chain of them) to get a number.
method::TypeCode retType_