bool type for AmArg

git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1456 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 17 years ago
parent 5f93066db3
commit 8fc7d2baaa

@ -29,16 +29,17 @@
#include "log.h"
#include "AmUtils.h"
const char* t2str(int type) {
const char* AmArg::t2str(int type) {
switch (type) {
case 0: return "Undef";
case 1: return "Int";
case 2: return "Double";
case 3: return "CStr";
case 4: return "AObject";
case 5: return "Blob";
case 6: return "Array";
case 7: return "Struct";
case AmArg::Undef: return "Undef";
case AmArg::Int: return "Int";
case AmArg::Bool: return "Bool";
case AmArg::Double: return "Double";
case AmArg::CStr: return "CStr";
case AmArg::AObject: return "AObject";
case AmArg::Blob: return "Blob";
case AmArg::Array: return "Array";
case AmArg::Struct: return "Struct";
default: return "unknown";
}
}
@ -57,6 +58,7 @@ AmArg& AmArg::operator=(const AmArg& v) {
type = v.type;
switch(type){
case Int: { v_int = v.v_int; } break;
case Bool: { v_bool = v.v_bool; } break;
case Double: { v_double = v.v_double; } break;
case CStr: { v_cstr = strdup(v.v_cstr); } break;
case AObject:{ v_obj = v.v_obj; } break;
@ -187,6 +189,25 @@ void AmArg::pop(AmArg &a) {
v_array->erase(v_array->begin());
}
void AmArg::pop_back(AmArg &a) {
assertArray();
if (!size()) {
if (a.getType() == AmArg::Undef)
return;
a = AmArg();
return;
}
a = v_array->back();
v_array->erase(v_array->end());
}
void AmArg::pop_back() {
assertArray();
if (!size())
return;
v_array->erase(v_array->end());
}
void AmArg::concat(const AmArg& a) {
assertArray();
if (a.getType() == Array) {
@ -281,6 +302,7 @@ bool operator==(const AmArg& lhs, const AmArg& rhs) {
switch(lhs.type){
case AmArg::Int: { return lhs.v_int == rhs.v_int; } break;
case AmArg::Bool: { return lhs.v_bool == rhs.v_bool; } break;
case AmArg::Double: { return lhs.v_double == rhs.v_double; } break;
case AmArg::CStr: { return !strcmp(lhs.v_cstr,rhs.v_cstr); } break;
case AmArg::AObject:{ return lhs.v_obj == rhs.v_obj; } break;
@ -325,6 +347,11 @@ void AmArg::erase(const char* name) {
v_struct->erase(name);
}
void AmArg::erase(const std::string& name) {
assertStruct();
v_struct->erase(name);
}
void AmArg::assertArrayFmt(const char* format) const {
size_t fmt_len = strlen(format);
string got;
@ -332,6 +359,7 @@ void AmArg::assertArrayFmt(const char* format) const {
for (size_t i=0;i<fmt_len;i++) {
switch (format[i]) {
case 'i': assertArgInt(get(i)); got+='i'; break;
case 't': assertArgBool(get(i)); got+='t'; break;
case 'f': assertArgDouble(get(i)); got+='f'; break;
case 's': assertArgCStr(get(i)); got+='s'; break;
case 'o': assertArgAObject(get(i)); got+='o'; break;
@ -358,6 +386,7 @@ void AmArg::assertArrayFmt(const char* format) const {
}
VECTOR_GETTER(string, asStringVector, asCStr)
VECTOR_GETTER(int, asIntVector, asInt)
VECTOR_GETTER(bool, asBoolVector, asBool)
VECTOR_GETTER(double, asDoubleVector, asDouble)
VECTOR_GETTER(ArgObject*, asArgObjectVector, asObject)
#undef VECTOR_GETTER
@ -379,7 +408,9 @@ string AmArg::print(const AmArg &a) {
case Undef:
return "<UNDEFINED>";
case Int:
return int2str(a.asInt());
return a.asInt()<0?"-"+int2str(abs(a.asInt())):int2str(abs(a.asInt()));
case Bool:
return a.asBool()?"true":"false";
case Double:
return double2str(a.asDouble());
case CStr:

@ -49,8 +49,7 @@ class ArgObject {
virtual ~ArgObject() { }
};
struct ArgBlob {
char* data;
struct ArgBlob { char* data;
int len;
ArgBlob()
@ -84,6 +83,7 @@ class AmArg
Undef=0,
Int,
Bool,
Double,
CStr,
AObject, // for passing pointers to objects not owned by AmArg
@ -111,6 +111,7 @@ class AmArg
// value
union {
int v_int;
bool v_bool;
double v_double;
const char* v_cstr;
ArgObject* v_obj;
@ -133,6 +134,11 @@ class AmArg
: type(Int),
v_int(v)
{ }
AmArg(const bool& v)
: type(Bool),
v_bool(v)
{ }
AmArg(const double& v)
: type(Double),
@ -185,6 +191,7 @@ class AmArg
#define isArgStruct(a)(AmArg::Struct == a.getType())
#define isArgDouble(a) (AmArg::Array == a.getType())
#define isArgInt(a) (AmArg::Int == a.getType())
#define isArgBool(a) (AmArg::Bool == a.getType())
#define isArgCStr(a) (AmArg::CStr == a.getType())
#define isArgAObject(a) (AmArg::AObject == a.getType())
#define isArgBlob(a) (AmArg::Blob == a.getType())
@ -204,6 +211,9 @@ class AmArg
#define assertArgInt(a) \
if (!isArgInt(a)) \
_THROW_TYPE_MISMATCH(Int,a);
#define assertArgBool(a) \
if (!isArgBool(a)) \
_THROW_TYPE_MISMATCH(Bool,a);
#define assertArgCStr(a) \
if (!isArgCStr(a)) \
_THROW_TYPE_MISMATCH(CStr,a);
@ -224,6 +234,7 @@ class AmArg
}
int asInt() const { return v_int; }
int asBool() const { return v_bool; }
double asDouble() const { return v_double; }
const char* asCStr() const { return v_cstr; }
ArgObject* asObject() const { return v_obj; }
@ -232,6 +243,7 @@ class AmArg
vector<string> asStringVector() const;
vector<int> asIntVector() const;
vector<bool> asBoolVector() const;
vector<double> asDoubleVector() const;
vector<ArgObject*> asArgObjectVector() const;
vector<ArgBlob> asArgBlobVector() const;
@ -242,6 +254,8 @@ class AmArg
void push(const AmArg& a);
void push(const string &key, const AmArg &val);
void pop(AmArg &a);
void pop_back(AmArg &a);
void pop_back();
void concat(const AmArg& a);
@ -278,10 +292,13 @@ class AmArg
/** remove struct member */
void erase(const char* name);
/** remove struct member */
void erase(const std::string& name);
/**
* throws exception if arg array does not conform to spec
* i - int
* t - bool
* f - double
* s - cstr
* o - object
@ -296,7 +313,11 @@ class AmArg
void clear();
friend bool operator==(const AmArg& lhs, const AmArg& rhs);
friend bool json2arg(std::istream& input, AmArg& res);
static string print(const AmArg &a);
const char* t2str(int type);
};
// equality

Loading…
Cancel
Save