| @@ -27,7 +27,6 @@ | |||
| #define WATER_HASHMAP_H_INCLUDED | |||
| #include "Array.h" | |||
| #include "../containers/Variant.h" | |||
| #include "../text/String.h" | |||
| #include "CarlaScopeUtils.hpp" | |||
| @@ -48,8 +47,6 @@ struct DefaultHashFunctions | |||
| int generateHash (const int64 key, const int upperLimit) const noexcept { return std::abs ((int) key) % upperLimit; } | |||
| /** Generates a simple hash from a string. */ | |||
| int generateHash (const String& key, const int upperLimit) const noexcept { return (int) (((uint32) key.hashCode()) % (uint32) upperLimit); } | |||
| /** Generates a simple hash from a variant. */ | |||
| int generateHash (const var& key, const int upperLimit) const noexcept { return generateHash (key.toString(), upperLimit); } | |||
| /** Generates a simple hash from a void ptr. */ | |||
| int generateHash (const void* key, const int upperLimit) const noexcept { return (int)(((pointer_sized_uint) key) % ((pointer_sized_uint) upperLimit)); } | |||
| }; | |||
| @@ -1,180 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the Water library. | |||
| Copyright (c) 2016 ROLI Ltd. | |||
| Copyright (C) 2017 Filipe Coelho <falktx@falktx.com> | |||
| Permission is granted to use this software under the terms of the ISC license | |||
| http://www.isc.org/downloads/software-support-policy/isc-license/ | |||
| Permission to use, copy, modify, and/or distribute this software for any | |||
| purpose with or without fee is hereby granted, provided that the above | |||
| copyright notice and this permission notice appear in all copies. | |||
| THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||
| FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, | |||
| OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||
| USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |||
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |||
| OF THIS SOFTWARE. | |||
| ============================================================================== | |||
| */ | |||
| #include "NamedValueSet.h" | |||
| namespace water { | |||
| //============================================================================== | |||
| NamedValueSet::NamedValueSet() noexcept | |||
| { | |||
| } | |||
| NamedValueSet::NamedValueSet (const NamedValueSet& other) | |||
| : values (other.values) | |||
| { | |||
| } | |||
| NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other) | |||
| { | |||
| clear(); | |||
| values = other.values; | |||
| return *this; | |||
| } | |||
| NamedValueSet::~NamedValueSet() noexcept | |||
| { | |||
| } | |||
| void NamedValueSet::clear() | |||
| { | |||
| values.clear(); | |||
| } | |||
| bool NamedValueSet::operator== (const NamedValueSet& other) const | |||
| { | |||
| return values == other.values; | |||
| } | |||
| bool NamedValueSet::operator!= (const NamedValueSet& other) const | |||
| { | |||
| return ! operator== (other); | |||
| } | |||
| int NamedValueSet::size() const noexcept | |||
| { | |||
| return values.size(); | |||
| } | |||
| bool NamedValueSet::isEmpty() const noexcept | |||
| { | |||
| return values.isEmpty(); | |||
| } | |||
| static const var& getNullVarRef() noexcept | |||
| { | |||
| static var nullVar; | |||
| return nullVar; | |||
| } | |||
| const var& NamedValueSet::operator[] (const Identifier& name) const noexcept | |||
| { | |||
| if (const var* v = getVarPointer (name)) | |||
| return *v; | |||
| return getNullVarRef(); | |||
| } | |||
| var NamedValueSet::getWithDefault (const Identifier& name, const var& defaultReturnValue) const | |||
| { | |||
| if (const var* const v = getVarPointer (name)) | |||
| return *v; | |||
| return defaultReturnValue; | |||
| } | |||
| var* NamedValueSet::getVarPointer (const Identifier& name) const noexcept | |||
| { | |||
| for (NamedValue* e = values.end(), *i = values.begin(); i != e; ++i) | |||
| if (i->name == name) | |||
| return &(i->value); | |||
| return nullptr; | |||
| } | |||
| bool NamedValueSet::set (const Identifier& name, const var& newValue) | |||
| { | |||
| if (var* const v = getVarPointer (name)) | |||
| { | |||
| if (v->equalsWithSameType (newValue)) | |||
| return false; | |||
| *v = newValue; | |||
| return true; | |||
| } | |||
| values.add (NamedValue (name, newValue)); | |||
| return true; | |||
| } | |||
| bool NamedValueSet::contains (const Identifier& name) const noexcept | |||
| { | |||
| return getVarPointer (name) != nullptr; | |||
| } | |||
| int NamedValueSet::indexOf (const Identifier& name) const noexcept | |||
| { | |||
| const int numValues = values.size(); | |||
| for (int i = 0; i < numValues; ++i) | |||
| if (values.getReference(i).name == name) | |||
| return i; | |||
| return -1; | |||
| } | |||
| bool NamedValueSet::remove (const Identifier& name) | |||
| { | |||
| const int numValues = values.size(); | |||
| for (int i = 0; i < numValues; ++i) | |||
| { | |||
| if (values.getReference(i).name == name) | |||
| { | |||
| values.remove (i); | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| Identifier NamedValueSet::getName (const int index) const noexcept | |||
| { | |||
| if (isPositiveAndBelow (index, values.size())) | |||
| return values.getReference (index).name; | |||
| wassertfalse; | |||
| return Identifier(); | |||
| } | |||
| const var& NamedValueSet::getValueAt (const int index) const noexcept | |||
| { | |||
| if (isPositiveAndBelow (index, values.size())) | |||
| return values.getReference (index).value; | |||
| wassertfalse; | |||
| return getNullVarRef(); | |||
| } | |||
| var* NamedValueSet::getVarPointerAt (int index) const noexcept | |||
| { | |||
| if (isPositiveAndBelow (index, values.size())) | |||
| return &(values.getReference (index).value); | |||
| return nullptr; | |||
| } | |||
| } | |||
| @@ -1,146 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the Water library. | |||
| Copyright (c) 2016 ROLI Ltd. | |||
| Copyright (C) 2017-2018 Filipe Coelho <falktx@falktx.com> | |||
| Permission is granted to use this software under the terms of the ISC license | |||
| http://www.isc.org/downloads/software-support-policy/isc-license/ | |||
| Permission to use, copy, modify, and/or distribute this software for any | |||
| purpose with or without fee is hereby granted, provided that the above | |||
| copyright notice and this permission notice appear in all copies. | |||
| THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||
| FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, | |||
| OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||
| USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |||
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |||
| OF THIS SOFTWARE. | |||
| ============================================================================== | |||
| */ | |||
| #ifndef WATER_NAMEDVALUESET_H_INCLUDED | |||
| #define WATER_NAMEDVALUESET_H_INCLUDED | |||
| #include "Array.h" | |||
| #include "Variant.h" | |||
| #include "../text/Identifier.h" | |||
| namespace water { | |||
| //============================================================================== | |||
| /** Holds a set of named var objects. | |||
| This can be used as a basic structure to hold a set of var object, which can | |||
| be retrieved by using their identifier. | |||
| */ | |||
| class NamedValueSet | |||
| { | |||
| public: | |||
| /** Creates an empty set. */ | |||
| NamedValueSet() noexcept; | |||
| /** Creates a copy of another set. */ | |||
| NamedValueSet (const NamedValueSet&); | |||
| /** Replaces this set with a copy of another set. */ | |||
| NamedValueSet& operator= (const NamedValueSet&); | |||
| /** Destructor. */ | |||
| ~NamedValueSet() noexcept; | |||
| bool operator== (const NamedValueSet&) const; | |||
| bool operator!= (const NamedValueSet&) const; | |||
| //============================================================================== | |||
| struct NamedValue | |||
| { | |||
| NamedValue() noexcept : name(), value() {} | |||
| NamedValue (const Identifier& n, const var& v) : name (n), value (v) {} | |||
| NamedValue (const NamedValue& other) : name (other.name), value (other.value) {} | |||
| bool operator== (const NamedValue& other) const noexcept { return name == other.name && value == other.value; } | |||
| bool operator!= (const NamedValue& other) const noexcept { return ! operator== (other); } | |||
| Identifier name; | |||
| var value; | |||
| }; | |||
| NamedValueSet::NamedValue* begin() { return values.begin(); } | |||
| NamedValueSet::NamedValue* end() { return values.end(); } | |||
| //============================================================================== | |||
| /** Returns the total number of values that the set contains. */ | |||
| int size() const noexcept; | |||
| /** Returns true if the set is empty. */ | |||
| bool isEmpty() const noexcept; | |||
| /** Returns the value of a named item. | |||
| If the name isn't found, this will return a void variant. | |||
| @see getProperty | |||
| */ | |||
| const var& operator[] (const Identifier& name) const noexcept; | |||
| /** Tries to return the named value, but if no such value is found, this will | |||
| instead return the supplied default value. | |||
| */ | |||
| var getWithDefault (const Identifier& name, const var& defaultReturnValue) const; | |||
| /** Changes or adds a named value. | |||
| @returns true if a value was changed or added; false if the | |||
| value was already set the value passed-in. | |||
| */ | |||
| bool set (const Identifier& name, const var& newValue); | |||
| /** Returns true if the set contains an item with the specified name. */ | |||
| bool contains (const Identifier& name) const noexcept; | |||
| /** Removes a value from the set. | |||
| @returns true if a value was removed; false if there was no value | |||
| with the name that was given. | |||
| */ | |||
| bool remove (const Identifier& name); | |||
| /** Returns the name of the value at a given index. | |||
| The index must be between 0 and size() - 1. | |||
| */ | |||
| Identifier getName (int index) const noexcept; | |||
| /** Returns a pointer to the var that holds a named value, or null if there is | |||
| no value with this name. | |||
| Do not use this method unless you really need access to the internal var object | |||
| for some reason - for normal reading and writing always prefer operator[]() and set(). | |||
| */ | |||
| var* getVarPointer (const Identifier& name) const noexcept; | |||
| /** Returns the value of the item at a given index. | |||
| The index must be between 0 and size() - 1. | |||
| */ | |||
| const var& getValueAt (int index) const noexcept; | |||
| /** Returns the value of the item at a given index. | |||
| The index must be between 0 and size() - 1, or this will return a nullptr | |||
| */ | |||
| var* getVarPointerAt (int index) const noexcept; | |||
| /** Returns the index of the given name, or -1 if it's not found. */ | |||
| int indexOf (const Identifier& name) const noexcept; | |||
| /** Removes all values. */ | |||
| void clear(); | |||
| private: | |||
| //============================================================================== | |||
| Array<NamedValue> values; | |||
| }; | |||
| } | |||
| #endif // WATER_NAMEDVALUESET_H_INCLUDED | |||
| @@ -1,297 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the Water library. | |||
| Copyright (c) 2016 ROLI Ltd. | |||
| Copyright (C) 2017 Filipe Coelho <falktx@falktx.com> | |||
| Permission is granted to use this software under the terms of the ISC license | |||
| http://www.isc.org/downloads/software-support-policy/isc-license/ | |||
| Permission to use, copy, modify, and/or distribute this software for any | |||
| purpose with or without fee is hereby granted, provided that the above | |||
| copyright notice and this permission notice appear in all copies. | |||
| THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||
| FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, | |||
| OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||
| USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |||
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |||
| OF THIS SOFTWARE. | |||
| ============================================================================== | |||
| */ | |||
| #include "Variant.h" | |||
| namespace water { | |||
| enum VariantStreamMarkers | |||
| { | |||
| varMarker_Int = 1, | |||
| varMarker_BoolTrue = 2, | |||
| varMarker_BoolFalse = 3, | |||
| varMarker_Double = 4, | |||
| varMarker_String = 5, | |||
| varMarker_Int64 = 6, | |||
| varMarker_Undefined = 9 | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType | |||
| { | |||
| public: | |||
| VariantType() noexcept {} | |||
| virtual ~VariantType() noexcept {} | |||
| virtual int toInt (const ValueUnion&) const noexcept { return 0; } | |||
| virtual int64 toInt64 (const ValueUnion&) const noexcept { return 0; } | |||
| virtual double toDouble (const ValueUnion&) const noexcept { return 0; } | |||
| virtual String toString (const ValueUnion&) const { return String(); } | |||
| virtual bool toBool (const ValueUnion&) const noexcept { return false; } | |||
| virtual var clone (const var& original) const { return original; } | |||
| virtual bool isVoid() const noexcept { return false; } | |||
| virtual bool isUndefined() const noexcept { return false; } | |||
| virtual bool isInt() const noexcept { return false; } | |||
| virtual bool isInt64() const noexcept { return false; } | |||
| virtual bool isBool() const noexcept { return false; } | |||
| virtual bool isDouble() const noexcept { return false; } | |||
| virtual bool isString() const noexcept { return false; } | |||
| virtual void cleanUp (ValueUnion&) const noexcept {} | |||
| virtual void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest = source; } | |||
| virtual bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept = 0; | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Void : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Void() noexcept {} | |||
| static const VariantType_Void instance; | |||
| bool isVoid() const noexcept override { return true; } | |||
| bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Undefined : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Undefined() noexcept {} | |||
| static const VariantType_Undefined instance; | |||
| bool isUndefined() const noexcept override { return true; } | |||
| String toString (const ValueUnion&) const override { return "undefined"; } | |||
| bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Int : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Int() noexcept {} | |||
| static const VariantType_Int instance; | |||
| int toInt (const ValueUnion& data) const noexcept override { return data.intValue; }; | |||
| int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.intValue; }; | |||
| double toDouble (const ValueUnion& data) const noexcept override { return (double) data.intValue; } | |||
| String toString (const ValueUnion& data) const override { return String (data.intValue); } | |||
| bool toBool (const ValueUnion& data) const noexcept override { return data.intValue != 0; } | |||
| bool isInt() const noexcept override { return true; } | |||
| bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override | |||
| { | |||
| if (otherType.isDouble() || otherType.isInt64() || otherType.isString()) | |||
| return otherType.equals (otherData, data, *this); | |||
| return otherType.toInt (otherData) == data.intValue; | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Int64 : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Int64() noexcept {} | |||
| static const VariantType_Int64 instance; | |||
| int toInt (const ValueUnion& data) const noexcept override { return (int) data.int64Value; }; | |||
| int64 toInt64 (const ValueUnion& data) const noexcept override { return data.int64Value; }; | |||
| double toDouble (const ValueUnion& data) const noexcept override { return (double) data.int64Value; } | |||
| String toString (const ValueUnion& data) const override { return String (data.int64Value); } | |||
| bool toBool (const ValueUnion& data) const noexcept override { return data.int64Value != 0; } | |||
| bool isInt64() const noexcept override { return true; } | |||
| bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override | |||
| { | |||
| if (otherType.isDouble() || otherType.isString()) | |||
| return otherType.equals (otherData, data, *this); | |||
| return otherType.toInt64 (otherData) == data.int64Value; | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Double : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Double() noexcept {} | |||
| static const VariantType_Double instance; | |||
| int toInt (const ValueUnion& data) const noexcept override { return (int) data.doubleValue; }; | |||
| int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.doubleValue; }; | |||
| double toDouble (const ValueUnion& data) const noexcept override { return data.doubleValue; } | |||
| String toString (const ValueUnion& data) const override { return String (data.doubleValue, 20); } | |||
| bool toBool (const ValueUnion& data) const noexcept override { return data.doubleValue != 0; } | |||
| bool isDouble() const noexcept override { return true; } | |||
| bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override | |||
| { | |||
| return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits<double>::epsilon(); | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_Bool : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_Bool() noexcept {} | |||
| static const VariantType_Bool instance; | |||
| int toInt (const ValueUnion& data) const noexcept override { return data.boolValue ? 1 : 0; }; | |||
| int64 toInt64 (const ValueUnion& data) const noexcept override { return data.boolValue ? 1 : 0; }; | |||
| double toDouble (const ValueUnion& data) const noexcept override { return data.boolValue ? 1.0 : 0.0; } | |||
| String toString (const ValueUnion& data) const override { return String::charToString (data.boolValue ? (water_uchar) '1' : (water_uchar) '0'); } | |||
| bool toBool (const ValueUnion& data) const noexcept override { return data.boolValue; } | |||
| bool isBool() const noexcept override { return true; } | |||
| bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override | |||
| { | |||
| return otherType.toBool (otherData) == data.boolValue; | |||
| } | |||
| }; | |||
| //============================================================================== | |||
| class var::VariantType_String : public var::VariantType | |||
| { | |||
| public: | |||
| VariantType_String() noexcept {} | |||
| static const VariantType_String instance; | |||
| void cleanUp (ValueUnion& data) const noexcept override { getString (data)-> ~String(); } | |||
| void createCopy (ValueUnion& dest, const ValueUnion& source) const override { new (dest.stringValue) String (*getString (source)); } | |||
| bool isString() const noexcept override { return true; } | |||
| int toInt (const ValueUnion& data) const noexcept override { return getString (data)->getIntValue(); }; | |||
| int64 toInt64 (const ValueUnion& data) const noexcept override { return getString (data)->getLargeIntValue(); }; | |||
| double toDouble (const ValueUnion& data) const noexcept override { return getString (data)->getDoubleValue(); } | |||
| String toString (const ValueUnion& data) const override { return *getString (data); } | |||
| bool toBool (const ValueUnion& data) const noexcept override { return getString (data)->getIntValue() != 0 | |||
| || getString (data)->trim().equalsIgnoreCase ("true") | |||
| || getString (data)->trim().equalsIgnoreCase ("yes"); } | |||
| bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override | |||
| { | |||
| return otherType.toString (otherData) == *getString (data); | |||
| } | |||
| private: | |||
| static inline const String* getString (const ValueUnion& data) noexcept { return reinterpret_cast<const String*> (data.stringValue); } | |||
| static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast<String*> (data.stringValue); } | |||
| }; | |||
| //============================================================================== | |||
| const var::VariantType_Void var::VariantType_Void::instance; | |||
| const var::VariantType_Undefined var::VariantType_Undefined::instance; | |||
| const var::VariantType_Int var::VariantType_Int::instance; | |||
| const var::VariantType_Int64 var::VariantType_Int64::instance; | |||
| const var::VariantType_Bool var::VariantType_Bool::instance; | |||
| const var::VariantType_Double var::VariantType_Double::instance; | |||
| const var::VariantType_String var::VariantType_String::instance; | |||
| //============================================================================== | |||
| var::var() noexcept : type (&VariantType_Void::instance) {} | |||
| var::var (const VariantType& t) noexcept : type (&t) {} | |||
| var::~var() noexcept { type->cleanUp (value); } | |||
| //============================================================================== | |||
| var::var (const var& valueToCopy) : type (valueToCopy.type) | |||
| { | |||
| type->createCopy (value, valueToCopy.value); | |||
| } | |||
| var::var (const int v) noexcept : type (&VariantType_Int::instance) { value.intValue = v; } | |||
| var::var (const int64 v) noexcept : type (&VariantType_Int64::instance) { value.int64Value = v; } | |||
| var::var (const bool v) noexcept : type (&VariantType_Bool::instance) { value.boolValue = v; } | |||
| var::var (const double v) noexcept : type (&VariantType_Double::instance) { value.doubleValue = v; } | |||
| var::var (const String& v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } | |||
| var::var (const char* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } | |||
| var var::undefined() noexcept { return var (VariantType_Undefined::instance); } | |||
| //============================================================================== | |||
| bool var::isVoid() const noexcept { return type->isVoid(); } | |||
| bool var::isUndefined() const noexcept { return type->isUndefined(); } | |||
| bool var::isInt() const noexcept { return type->isInt(); } | |||
| bool var::isInt64() const noexcept { return type->isInt64(); } | |||
| bool var::isBool() const noexcept { return type->isBool(); } | |||
| bool var::isDouble() const noexcept { return type->isDouble(); } | |||
| bool var::isString() const noexcept { return type->isString(); } | |||
| var::operator int() const noexcept { return type->toInt (value); } | |||
| var::operator int64() const noexcept { return type->toInt64 (value); } | |||
| var::operator bool() const noexcept { return type->toBool (value); } | |||
| var::operator float() const noexcept { return (float) type->toDouble (value); } | |||
| var::operator double() const noexcept { return type->toDouble (value); } | |||
| String var::toString() const { return type->toString (value); } | |||
| var::operator String() const { return type->toString (value); } | |||
| //============================================================================== | |||
| void var::swapWith (var& other) noexcept | |||
| { | |||
| std::swap (type, other.type); | |||
| std::swap (value, other.value); | |||
| } | |||
| var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; } | |||
| var& var::operator= (const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v; return *this; } | |||
| var& var::operator= (const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v; return *this; } | |||
| var& var::operator= (const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v; return *this; } | |||
| var& var::operator= (const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v; return *this; } | |||
| var& var::operator= (const char* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } | |||
| var& var::operator= (const String& v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } | |||
| //============================================================================== | |||
| bool var::equals (const var& other) const noexcept | |||
| { | |||
| return type->equals (value, other.value, *other.type); | |||
| } | |||
| bool var::equalsWithSameType (const var& other) const noexcept | |||
| { | |||
| return type == other.type && equals (other); | |||
| } | |||
| bool var::hasSameTypeAs (const var& other) const noexcept | |||
| { | |||
| return type == other.type; | |||
| } | |||
| bool operator== (const var& v1, const var& v2) noexcept { return v1.equals (v2); } | |||
| bool operator!= (const var& v1, const var& v2) noexcept { return ! v1.equals (v2); } | |||
| bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; } | |||
| bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; } | |||
| bool operator== (const var& v1, const char* const v2) { return v1.toString() == v2; } | |||
| bool operator!= (const var& v1, const char* const v2) { return v1.toString() != v2; } | |||
| //============================================================================== | |||
| var var::clone() const noexcept | |||
| { | |||
| return type->clone (*this); | |||
| } | |||
| } | |||
| @@ -1,171 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the Water library. | |||
| Copyright (c) 2016 ROLI Ltd. | |||
| Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com> | |||
| Permission is granted to use this software under the terms of the ISC license | |||
| http://www.isc.org/downloads/software-support-policy/isc-license/ | |||
| Permission to use, copy, modify, and/or distribute this software for any | |||
| purpose with or without fee is hereby granted, provided that the above | |||
| copyright notice and this permission notice appear in all copies. | |||
| THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | |||
| FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, | |||
| OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF | |||
| USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |||
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |||
| OF THIS SOFTWARE. | |||
| ============================================================================== | |||
| */ | |||
| #ifndef WATER_VARIANT_H_INCLUDED | |||
| #define WATER_VARIANT_H_INCLUDED | |||
| #include "../text/String.h" | |||
| namespace water { | |||
| //============================================================================== | |||
| /** | |||
| A variant class, that can be used to hold a range of primitive values. | |||
| A var object can hold a range of simple primitive values, strings, or | |||
| any kind of ReferenceCountedObject. The var class is intended to act like | |||
| the kind of values used in dynamic scripting languages. | |||
| You can save/load var objects either in a small, proprietary binary format | |||
| using writeToStream()/readFromStream(), or as JSON by using the JSON class. | |||
| @see JSON, DynamicObject | |||
| */ | |||
| class var | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Creates a void variant. */ | |||
| var() noexcept; | |||
| /** Destructor. */ | |||
| ~var() noexcept; | |||
| var (const var& valueToCopy); | |||
| var (int value) noexcept; | |||
| var (int64 value) noexcept; | |||
| var (bool value) noexcept; | |||
| var (double value) noexcept; | |||
| var (const char* value); | |||
| var (const String& value); | |||
| var& operator= (const var& valueToCopy); | |||
| var& operator= (int value); | |||
| var& operator= (int64 value); | |||
| var& operator= (bool value); | |||
| var& operator= (double value); | |||
| var& operator= (const char* value); | |||
| var& operator= (const String& value); | |||
| void swapWith (var& other) noexcept; | |||
| /** Returns a var object that can be used where you need the javascript "undefined" value. */ | |||
| static var undefined() noexcept; | |||
| //============================================================================== | |||
| operator int() const noexcept; | |||
| operator int64() const noexcept; | |||
| operator bool() const noexcept; | |||
| operator float() const noexcept; | |||
| operator double() const noexcept; | |||
| operator String() const; | |||
| String toString() const; | |||
| //============================================================================== | |||
| bool isVoid() const noexcept; | |||
| bool isUndefined() const noexcept; | |||
| bool isInt() const noexcept; | |||
| bool isInt64() const noexcept; | |||
| bool isBool() const noexcept; | |||
| bool isDouble() const noexcept; | |||
| bool isString() const noexcept; | |||
| /** Returns true if this var has the same value as the one supplied. | |||
| Note that this ignores the type, so a string var "123" and an integer var with the | |||
| value 123 are considered to be equal. | |||
| @see equalsWithSameType | |||
| */ | |||
| bool equals (const var& other) const noexcept; | |||
| /** Returns true if this var has the same value and type as the one supplied. | |||
| This differs from equals() because e.g. "123" and 123 will be considered different. | |||
| @see equals | |||
| */ | |||
| bool equalsWithSameType (const var& other) const noexcept; | |||
| /** Returns true if this var has the same type as the one supplied. */ | |||
| bool hasSameTypeAs (const var& other) const noexcept; | |||
| /** Returns a deep copy of this object. | |||
| For simple types this just returns a copy, but if the object contains any arrays | |||
| or DynamicObjects, they will be cloned (recursively). | |||
| */ | |||
| var clone() const noexcept; | |||
| private: | |||
| //============================================================================== | |||
| class VariantType; friend class VariantType; | |||
| class VariantType_Void; friend class VariantType_Void; | |||
| class VariantType_Undefined; friend class VariantType_Undefined; | |||
| class VariantType_Int; friend class VariantType_Int; | |||
| class VariantType_Int64; friend class VariantType_Int64; | |||
| class VariantType_Double; friend class VariantType_Double; | |||
| class VariantType_Bool; friend class VariantType_Bool; | |||
| class VariantType_String; friend class VariantType_String; | |||
| union ValueUnion | |||
| { | |||
| int intValue; | |||
| int64 int64Value; | |||
| bool boolValue; | |||
| double doubleValue; | |||
| char stringValue [sizeof (String)]; | |||
| }; | |||
| const VariantType* type; | |||
| ValueUnion value; | |||
| var (const VariantType&) noexcept; | |||
| }; | |||
| /** Compares the values of two var objects, using the var::equals() comparison. */ | |||
| bool operator== (const var&, const var&) noexcept; | |||
| /** Compares the values of two var objects, using the var::equals() comparison. */ | |||
| bool operator!= (const var&, const var&) noexcept; | |||
| bool operator== (const var&, const String&); | |||
| bool operator!= (const var&, const String&); | |||
| bool operator== (const var&, const char*); | |||
| bool operator!= (const var&, const char*); | |||
| //============================================================================== | |||
| /** This template-overloaded class can be used to convert between var and custom types. */ | |||
| template <typename Type> | |||
| struct VariantConverter | |||
| { | |||
| static Type fromVar (const var& v) { return static_cast<Type> (v); } | |||
| static var toVar (const Type& t) { return t; } | |||
| }; | |||
| /** This template-overloaded class can be used to convert between var and custom types. */ | |||
| template <> | |||
| struct VariantConverter<String> | |||
| { | |||
| static String fromVar (const var& v) { return v.toString(); } | |||
| static var toVar (const String& s) { return s; } | |||
| }; | |||
| } | |||
| #endif // WATER_VARIANT_H_INCLUDED | |||
| @@ -46,9 +46,6 @@ BOOL WINAPI DllMain (HINSTANCE hInst, DWORD reason, LPVOID) | |||
| } | |||
| #include "containers/NamedValueSet.cpp" | |||
| #include "containers/Variant.cpp" | |||
| #include "files/DirectoryIterator.cpp" | |||
| #include "files/File.cpp" | |||
| #include "files/FileInputStream.cpp" | |||