diff options
Diffstat (limited to 'cpp/sca/runtime/core/src/tuscany/value.hpp')
-rw-r--r-- | cpp/sca/runtime/core/src/tuscany/value.hpp | 212 |
1 files changed, 114 insertions, 98 deletions
diff --git a/cpp/sca/runtime/core/src/tuscany/value.hpp b/cpp/sca/runtime/core/src/tuscany/value.hpp index e92a9178ca..ca4bd06ca6 100644 --- a/cpp/sca/runtime/core/src/tuscany/value.hpp +++ b/cpp/sca/runtime/core/src/tuscany/value.hpp @@ -27,16 +27,11 @@ */ #include <string> -#include <ostream> +#include <iostream> #include "gc.hpp" #include "function.hpp" #include "list.hpp" -using std::string; -using std::ostream; -using std::cout; -using std::endl; - namespace tuscany { @@ -51,72 +46,70 @@ bool resetValueCounters() { } bool printValueCounters() { - using std::cout; - using std::endl; - cout << "countValues " << countValues << endl; - cout << "countEValues " << countEValues << endl; - cout << "countCValues " << countCValues << endl; - cout << "countVValues " << countVValues << endl; + std::cout << "countValues " << countValues << std::endl; + std::cout << "countEValues " << countEValues << std::endl; + std::cout << "countCValues " << countCValues << std::endl; + std::cout << "countVValues " << countVValues << std::endl; return true; } -class Value; +class value; -class Value { +class value { public: enum ValueType { Undefined, Symbol, String, List, Number, Boolean, Character, Lambda }; - Value() : - type(Value::Undefined) { + value() : + type(value::Undefined) { countValues++; countEValues++; } - Value(const Value& v) { + value(const value& v) { countValues++; countCValues++; type = v.type; switch(type) { - case Value::List: + case value::List: lst() = v.lst(); - case Value::Lambda: + case value::Lambda: func() = v.func(); - case Value::Symbol: + case value::Symbol: str() = v.str(); - case Value::String: + case value::String: str() = v.str(); - case Value::Number: + case value::Number: num() = v.num(); - case Value::Boolean: + case value::Boolean: boo() = v.boo(); - case Value::Character: + case value::Character: chr() = v.chr(); default: break; } } - const Value& operator=(const Value& v) { + const value& operator=(const value& v) { if(this == &v) return *this; type = v.type; switch(type) { - case Value::List: + case value::List: lst() = v.lst(); - case Value::Lambda: + case value::Lambda: func() = v.func(); - case Value::Symbol: + case value::Symbol: str() = v.str(); - case Value::String: + case value::String: str() = v.str(); - case Value::Number: + case value::Number: num() = v.num(); - case Value::Boolean: + case value::Boolean: boo() = v.boo(); - case Value::Character: + case value::Character: chr() = v.chr(); default: break; @@ -124,122 +117,122 @@ public: return *this; } - virtual ~Value() { + virtual ~value() { countValues--; } - Value(const lambda<Value(list<Value>&)>& func) : - type(Value::Lambda), data(vdata(func)) { + explicit value(const lambda<value(list<value>&)>& func) : + type(value::Lambda), data(vdata(func)) { countValues++; countVValues++; } - Value(const string& str) : - type(Value::String), data(vdata(unit(str))) { + explicit value(const std::string& str) : + type(value::String), data(vdata(unit(str))) { countValues++; countVValues++; } - Value(const char* str) : - type(Value::Symbol), data(vdata(unit(string(str)))) { + explicit value(const char* str) : + type(value::Symbol), data(vdata(unit(std::string(str)))) { countValues++; countVValues++; } - Value(const list<Value>& lst) : - type(Value::List), data(vdata(unit(lst))) { + explicit value(const list<value>& lst) : + type(value::List), data(vdata(unit(lst))) { countValues++; countVValues++; } - Value(const double num) : - type(Value::Number), data(vdata(unit(num))) { + explicit value(const double num) : + type(value::Number), data(vdata(unit(num))) { countValues++; countVValues++; } - Value(const int num) : - type(Value::Number), data(vdata(unit((double)num))) { + explicit value(const int num) : + type(value::Number), data(vdata(unit((double)num))) { countValues++; countVValues++; } - Value(const bool boo) : - type(Value::Boolean), data(vdata(unit(boo))) { + explicit value(const bool boo) : + type(value::Boolean), data(vdata(unit(boo))) { countValues++; countVValues++; } - Value(const char chr) : - type(Value::Character), data(vdata(unit(chr))) { + explicit value(const char chr) : + type(value::Character), data(vdata(unit(chr))) { countValues++; countVValues++; } - const bool operator!=(const Value& v) const { + const bool operator!=(const value& v) const { return !this->operator==(v); } - const bool operator==(const Value& v) const { + const bool operator==(const value& v) const { if(this == &v) return true; if(type != v.type) return false; switch(type) { - case Value::Undefined: + case value::Undefined: return true; - case Value::List: + case value::List: return lst()() == v.lst()(); - case Value::Lambda: + case value::Lambda: return func() == v.func(); - case Value::Symbol: + case value::Symbol: return str()() == v.str()(); - case Value::String: + case value::String: return str()() == v.str()(); - case Value::Number: + case value::Number: return num()() == v.num()(); - case Value::Boolean: + case value::Boolean: return boo()() == v.boo()(); - case Value::Character: + case value::Character: return chr()() == v.chr()(); default: return false; } } - const Value operator()(list<Value>& args) const { + const value operator()(list<value>& args) const { return func()(args); } - operator string() const { + operator const std::string() const { return str()(); } - operator double() const { + operator const double() const { return num()(); } - operator int() const { + operator const int() const { return num()(); } - operator bool() const { + operator const bool() const { return boo()(); } - operator char() const { + operator const char() const { return chr()(); } - operator list<Value>() const { + operator const list<value>() const { return lst()(); } - operator lambda<Value(list<Value>&)>() const { + operator const lambda<value(list<value>&)>() const { return func(); } - friend ostream& operator<<(ostream&, const Value&); + friend std::ostream& operator<<(std::ostream&, const value&); ValueType type; lambda<char()> data; @@ -265,77 +258,100 @@ private: return vdata<char()> (); } - lambda<string()>& str() const { - return vdata<string()> (); + lambda<std::string()>& str() const { + return vdata<std::string()> (); } - lambda<list<Value>()>& lst() const { - return vdata<list<Value>()> (); + lambda<list<value>()>& lst() const { + return vdata<list<value>()> (); } - lambda<Value(list<Value>&)>& func() const { - return vdata<Value(list<Value>&)> (); + lambda<value(list<value>&)>& func() const { + return vdata<value(list<value>&)> (); } }; -ostream& operator<<(ostream& out, const Value& v) { +std::ostream& operator<<(std::ostream& out, const value& v) { switch(v.type) { - case Value::List: + case value::List: return out << "List::" << v.lst()(); - case Value::Lambda: + case value::Lambda: return out << "Lambda::" << v.func(); - case Value::Symbol: + case value::Symbol: return out << "Symbol::" << v.str()(); - case Value::String: + case value::String: return out << "String::" << '\'' << v.str()() << '\''; - case Value::Number: + case value::Number: return out << "Number::" << v.num()(); - case Value::Boolean: + case value::Boolean: if(v.boo()()) return out << "Boolean::" << "true"; else return out << "Boolean::" << "false"; - case Value::Character: + case value::Character: return out << "Character::" << v.chr()(); default: return out << "Undefined"; } } -const bool isNull(const Value& value) { - return value.type == Value::Undefined; +const bool isNil(const value& value) { + return value.type == value::Undefined; } -const bool isString(const Value& value) { - return value.type == Value::String; +const bool isString(const value& value) { + return value.type == value::String; } -const bool isSymbol(const Value& value) { - return value.type == Value::Symbol; +const bool isSymbol(const value& value) { + return value.type == value::Symbol; } -const bool isList(const Value& value) { - return value.type == Value::List; +const bool isList(const value& value) { + return value.type == value::List; } -const bool isNumber(const Value& value) { - return value.type == Value::Number; +const bool isNumber(const value& value) { + return value.type == value::Number; } -const bool isBoolean(const Value& value) { - return value.type == Value::Boolean; +const bool isBoolean(const value& value) { + return value.type == value::Boolean; } -const bool isCharacter(const Value& value) { - return value.type == Value::Character; +const bool isCharacter(const value& value) { + return value.type == value::Character; } -const bool isTaggedList(const Value& exp, Value tag) { +const bool isTaggedList(const value& exp, value tag) { if(isList(exp)) - return car((list<Value> )exp) == tag; + return car((list<value> )exp) == tag; return false; } +/** + * Pretty print a list of values. + */ +std::ostream& print(const list<value>& l, std::ostream& os) { + os << "("; + if (!isNil(l)) { + list<value> ml = l; + while(true) { + const value v = car(ml); + if (isList(v)) + print(list<value>(v), os); + else + os << v; + ml = cdr(ml); + if (isNil(ml)) + break; + os << ", "; + } + } + os << ")"; + return os; +} + } #endif /* tuscany_value_hpp */ |