From 8fc7d2baaa046e59a74cac68ac4407aa93adf50f Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Tue, 7 Jul 2009 15:50:57 +0000 Subject: [PATCH] bool type for AmArg git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1456 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- core/AmArg.cpp | 51 ++++++++++++++++++++++++++++++++++++++++---------- core/AmArg.h | 25 +++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/core/AmArg.cpp b/core/AmArg.cpp index 938d275c..095109c4 100644 --- a/core/AmArg.cpp +++ b/core/AmArg.cpp @@ -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"; 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: diff --git a/core/AmArg.h b/core/AmArg.h index 9d8ea952..1fd1baa9 100644 --- a/core/AmArg.h +++ b/core/AmArg.h @@ -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 asStringVector() const; vector asIntVector() const; + vector asBoolVector() const; vector asDoubleVector() const; vector asArgObjectVector() const; vector 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