diff options
-rw-r--r-- | third_party/nix/src/libexpr/CMakeLists.txt | 1 | ||||
-rw-r--r-- | third_party/nix/src/libexpr/value.cc | 121 | ||||
-rw-r--r-- | third_party/nix/src/libexpr/value.hh | 7 |
3 files changed, 129 insertions, 0 deletions
diff --git a/third_party/nix/src/libexpr/CMakeLists.txt b/third_party/nix/src/libexpr/CMakeLists.txt index 7a6b01a9d405..8cb7143d2c4b 100644 --- a/third_party/nix/src/libexpr/CMakeLists.txt +++ b/third_party/nix/src/libexpr/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources(nixexpr parser.cc primops.cc symbol-table.cc + value.cc value-to-json.cc value-to-xml.cc ) diff --git a/third_party/nix/src/libexpr/value.cc b/third_party/nix/src/libexpr/value.cc new file mode 100644 index 000000000000..93fe1874786a --- /dev/null +++ b/third_party/nix/src/libexpr/value.cc @@ -0,0 +1,121 @@ +#include "libexpr/value.hh" + +#include <glog/logging.h> + +namespace nix { + +Value::Value(const Value& copy) { *this = copy; } + +Value::Value(Value&& move) { *this = move; } + +Value& Value::operator=(const Value& copy) { + if (type != copy.type) { + memset(this, 0, sizeof(*this)); + } + type = copy.type; + switch (type) { + case tInt: + integer = copy.integer; + break; + case tBool: + boolean = copy.boolean; + break; + case tString: + string = copy.string; + break; + case tPath: + path = copy.path; + break; + case tNull: + /* no fields */ + break; + case tAttrs: + attrs = copy.attrs; + break; + case tList: + list = copy.list; + break; + case tThunk: + thunk = copy.thunk; + break; + case tApp: + app = copy.app; + break; + case tLambda: + lambda = copy.lambda; + break; + case tBlackhole: + /* no fields */ + break; + case tPrimOp: + primOp = copy.primOp; + break; + case tPrimOpApp: + primOpApp = copy.primOpApp; + break; + case _reserved1: + LOG(FATAL) << "attempted to assign a tExternal value"; + break; + case tFloat: + fpoint = copy.fpoint; + break; + } + return *this; +} + +Value& Value::operator=(Value&& move) { + if (type != move.type) { + memset(this, 0, sizeof(*this)); + } + type = move.type; + switch (type) { + case tInt: + integer = move.integer; + break; + case tBool: + boolean = move.boolean; + break; + case tString: + string = move.string; + break; + case tPath: + path = move.path; + break; + case tNull: + /* no fields */ + break; + case tAttrs: + attrs = move.attrs; + break; + case tList: + list = move.list; + break; + case tThunk: + thunk = move.thunk; + break; + case tApp: + app = move.app; + break; + case tLambda: + lambda = move.lambda; + break; + case tBlackhole: + /* no fields */ + break; + case tPrimOp: + primOp = move.primOp; + break; + case tPrimOpApp: + primOpApp = move.primOpApp; + break; + case _reserved1: + LOG(FATAL) << "attempted to assign a tExternal value"; + break; + case tFloat: + fpoint = move.fpoint; + break; + } + return *this; +} + +} // namespace nix diff --git a/third_party/nix/src/libexpr/value.hh b/third_party/nix/src/libexpr/value.hh index 6bb694d1830b..85ce9e7a1ba0 100644 --- a/third_party/nix/src/libexpr/value.hh +++ b/third_party/nix/src/libexpr/value.hh @@ -105,6 +105,13 @@ struct Value { NixFloat fpoint; }; + Value() : type(tInt), integer(0) {} + Value(const Value& copy); + Value(Value&& move); + ~Value() {} + Value& operator=(const Value& copy); + Value& operator=(Value&& move); + bool isList() const { return type == tList; } size_t listSize() const { return list->size(); } |