diff --git a/source/modules/water/containers/HashMap.h b/source/modules/water/containers/HashMap.h index a0c5efd08..324705d50 100644 --- a/source/modules/water/containers/HashMap.h +++ b/source/modules/water/containers/HashMap.h @@ -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)); } }; diff --git a/source/modules/water/containers/NamedValueSet.cpp b/source/modules/water/containers/NamedValueSet.cpp deleted file mode 100644 index 7543af158..000000000 --- a/source/modules/water/containers/NamedValueSet.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - ============================================================================== - - This file is part of the Water library. - Copyright (c) 2016 ROLI Ltd. - Copyright (C) 2017 Filipe Coelho - - 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; -} - -} diff --git a/source/modules/water/containers/NamedValueSet.h b/source/modules/water/containers/NamedValueSet.h deleted file mode 100644 index ea4ef421d..000000000 --- a/source/modules/water/containers/NamedValueSet.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - ============================================================================== - - This file is part of the Water library. - Copyright (c) 2016 ROLI Ltd. - Copyright (C) 2017-2018 Filipe Coelho - - 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 values; -}; - -} - -#endif // WATER_NAMEDVALUESET_H_INCLUDED diff --git a/source/modules/water/containers/Variant.cpp b/source/modules/water/containers/Variant.cpp deleted file mode 100644 index 0472b10e3..000000000 --- a/source/modules/water/containers/Variant.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - ============================================================================== - - This file is part of the Water library. - Copyright (c) 2016 ROLI Ltd. - Copyright (C) 2017 Filipe Coelho - - 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::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 (data.stringValue); } - static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast (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); -} - -} diff --git a/source/modules/water/containers/Variant.h b/source/modules/water/containers/Variant.h deleted file mode 100644 index 39ebd97bd..000000000 --- a/source/modules/water/containers/Variant.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ============================================================================== - - This file is part of the Water library. - Copyright (c) 2016 ROLI Ltd. - Copyright (C) 2017-2022 Filipe Coelho - - 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 -struct VariantConverter -{ - static Type fromVar (const var& v) { return static_cast (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 -{ - static String fromVar (const var& v) { return v.toString(); } - static var toVar (const String& s) { return s; } -}; - -} - -#endif // WATER_VARIANT_H_INCLUDED diff --git a/source/modules/water/water.cpp b/source/modules/water/water.cpp index 8903c16d2..fa2e65984 100644 --- a/source/modules/water/water.cpp +++ b/source/modules/water/water.cpp @@ -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"