2019-11-23 20:27:39 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2013-2017 Chukong Technologies
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2021-07-15 12:21:38 +08:00
|
|
|
Copyright (c) 2021 Bytedance Inc.
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2021-07-15 12:21:38 +08:00
|
|
|
https://adxe.org
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __cocos2d_libs__CCValue__
|
|
|
|
#define __cocos2d_libs__CCValue__
|
|
|
|
|
|
|
|
#include "platform/CCPlatformMacros.h"
|
|
|
|
#include "base/ccMacros.h"
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @addtogroup base
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
|
|
|
|
class Value;
|
|
|
|
|
|
|
|
typedef std::vector<Value> ValueVector;
|
2021-12-26 23:26:34 +08:00
|
|
|
typedef hlookup::string_map<Value> ValueMap;
|
2019-11-23 20:27:39 +08:00
|
|
|
typedef std::unordered_map<int, Value> ValueMapIntKey;
|
|
|
|
|
|
|
|
CC_DLL extern const ValueVector ValueVectorNull;
|
|
|
|
CC_DLL extern const ValueMap ValueMapNull;
|
|
|
|
CC_DLL extern const ValueMapIntKey ValueMapIntKeyNull;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This class is provide as a wrapper of basic types, such as int and bool.
|
|
|
|
*/
|
|
|
|
class CC_DLL Value
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** A predefined Value that has not value. */
|
|
|
|
static const Value Null;
|
2020-03-03 19:24:07 +08:00
|
|
|
static const std::string NullString;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Default constructor. */
|
|
|
|
Value();
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by an unsigned char value. */
|
|
|
|
explicit Value(unsigned char v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by an integer value. */
|
|
|
|
explicit Value(int v);
|
|
|
|
|
|
|
|
/** Create a Value by an unsigned value. */
|
|
|
|
explicit Value(unsigned int v);
|
|
|
|
|
2021-11-09 14:29:15 +08:00
|
|
|
/** Create a Value by an integer value. */
|
|
|
|
explicit Value(int64_t v);
|
|
|
|
|
|
|
|
/** Create a Value by an integer value. */
|
|
|
|
explicit Value(uint64_t v);
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a float value. */
|
|
|
|
explicit Value(float v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a double value. */
|
|
|
|
explicit Value(double v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a bool value. */
|
|
|
|
explicit Value(bool v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a char pointer. It will copy the chars internally. */
|
|
|
|
explicit Value(const char* v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a string. */
|
2021-12-26 23:26:34 +08:00
|
|
|
explicit Value(std::string_view v);
|
2021-06-25 07:30:47 +08:00
|
|
|
|
|
|
|
explicit Value(std::string&& v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a ValueVector object. */
|
|
|
|
explicit Value(const ValueVector& v);
|
|
|
|
/** Create a Value by a ValueVector object. It will use std::move internally. */
|
|
|
|
explicit Value(ValueVector&& v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a ValueMap object. */
|
|
|
|
explicit Value(const ValueMap& v);
|
|
|
|
/** Create a Value by a ValueMap object. It will use std::move internally. */
|
|
|
|
explicit Value(ValueMap&& v);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Create a Value by a ValueMapIntKey object. */
|
|
|
|
explicit Value(const ValueMapIntKey& v);
|
|
|
|
/** Create a Value by a ValueMapIntKey object. It will use std::move internally. */
|
|
|
|
explicit Value(ValueMapIntKey&& v);
|
|
|
|
|
|
|
|
/** Create a Value by another Value object. */
|
|
|
|
Value(const Value& other);
|
|
|
|
/** Create a Value by a Value object. It will use std::move internally. */
|
|
|
|
Value(Value&& other);
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Destructor. */
|
|
|
|
~Value();
|
|
|
|
|
|
|
|
/** Assignment operator, assign from Value to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(const Value& other);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from Value to Value. It will use std::move internally. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(Value&& other);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Assignment operator, assign from unsigned char to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(unsigned char v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from integer to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(int v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from integer to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(unsigned int v);
|
2021-11-09 14:29:15 +08:00
|
|
|
/** Assignment operator, assign from integer to Value. */
|
|
|
|
Value& operator=(int64_t v);
|
|
|
|
/** Assignment operator, assign from integer to Value. */
|
|
|
|
Value& operator=(uint64_t v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from float to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(float v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from double to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(double v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from bool to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(bool v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from char* to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(const char* v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from string to Value. */
|
2021-12-26 23:26:34 +08:00
|
|
|
Value& operator=(std::string_view v);
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(std::string&& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Assignment operator, assign from ValueVector to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(const ValueVector& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from ValueVector to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(ValueVector&& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Assignment operator, assign from ValueMap to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(const ValueMap& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from ValueMap to Value. It will use std::move internally. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(ValueMap&& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Assignment operator, assign from ValueMapIntKey to Value. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(const ValueMapIntKey& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Assignment operator, assign from ValueMapIntKey to Value. It will use std::move internally. */
|
2021-12-25 10:04:45 +08:00
|
|
|
Value& operator=(ValueMapIntKey&& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** != operator overloading */
|
2021-12-25 10:04:45 +08:00
|
|
|
bool operator!=(const Value& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** != operator overloading */
|
2021-12-25 10:04:45 +08:00
|
|
|
bool operator!=(const Value& v) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** == operator overloading */
|
2021-12-25 10:04:45 +08:00
|
|
|
bool operator==(const Value& v);
|
2019-11-23 20:27:39 +08:00
|
|
|
/** == operator overloading */
|
2021-12-25 10:04:45 +08:00
|
|
|
bool operator==(const Value& v) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Gets as a byte value. Will convert to unsigned char if possible, or will trigger assert error. */
|
2021-07-15 12:21:38 +08:00
|
|
|
unsigned char asByte(unsigned char defaultValue = 0) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets as an integer value. Will convert to integer if possible, or will trigger assert error. */
|
2021-07-15 12:21:38 +08:00
|
|
|
int asInt(int defaultValue = 0) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets as an unsigned value. Will convert to unsigned if possible, or will trigger assert error. */
|
2021-11-09 14:29:15 +08:00
|
|
|
unsigned int asUint(unsigned int defaultValue = 0) const;
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Gets as an unsigned value. Will convert to unsigned if possible, or will trigger assert error.
|
|
|
|
* !!!DEPRECATED, use asUint instead
|
|
|
|
*/
|
2021-11-09 14:29:15 +08:00
|
|
|
unsigned int asUnsignedInt(unsigned int defaultValue = 0) const { return asUint(defaultValue); }
|
2021-11-09 15:24:41 +08:00
|
|
|
/** Gets as an int64_t value. Will convert to integer if possible, or will trigger assert error. */
|
2021-11-09 14:29:15 +08:00
|
|
|
int64_t asInt64(int64_t defaultValue = 0) const;
|
2021-11-09 15:24:41 +08:00
|
|
|
/** Gets as an uint64_t value. Will convert to unsigned if possible, or will trigger assert error. */
|
2021-11-09 14:29:15 +08:00
|
|
|
uint64_t asUint64(uint64_t defaultValue = 0) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets as a float value. Will convert to float if possible, or will trigger assert error. */
|
2021-07-15 12:21:38 +08:00
|
|
|
float asFloat(float defaultValue = 0.0f) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets as a double value. Will convert to double if possible, or will trigger assert error. */
|
2021-07-15 12:21:38 +08:00
|
|
|
double asDouble(double defaultValue = 0.0) const;
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets as a bool value. Will convert to bool if possible, or will trigger assert error. */
|
2021-07-15 12:21:38 +08:00
|
|
|
bool asBool(bool defaultValue = false) const;
|
2020-03-03 19:24:07 +08:00
|
|
|
/** to as a string value. Will convert to string if possible, or will trigger assert error. */
|
2020-08-18 11:33:18 +08:00
|
|
|
std::string asString() const;
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2020-08-18 11:33:18 +08:00
|
|
|
/** Gets as a string value reference without conversion, if value type is not string will return "" */
|
2021-12-26 23:26:34 +08:00
|
|
|
std::string_view asStringRef() const;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/** Gets as a ValueVector reference. Will convert to ValueVector if possible, or will trigger assert error. */
|
|
|
|
ValueVector& asValueVector();
|
|
|
|
/** Gets as a const ValueVector reference. Will convert to ValueVector if possible, or will trigger assert error. */
|
|
|
|
const ValueVector& asValueVector() const;
|
|
|
|
|
|
|
|
/** Gets as a ValueMap reference. Will convert to ValueMap if possible, or will trigger assert error. */
|
|
|
|
ValueMap& asValueMap();
|
|
|
|
/** Gets as a const ValueMap reference. Will convert to ValueMap if possible, or will trigger assert error. */
|
|
|
|
const ValueMap& asValueMap() const;
|
|
|
|
|
|
|
|
/** Gets as a ValueMapIntKey reference. Will convert to ValueMapIntKey if possible, or will trigger assert error. */
|
|
|
|
ValueMapIntKey& asIntKeyMap();
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Gets as a const ValueMapIntKey reference. Will convert to ValueMapIntKey if possible, or will trigger assert
|
|
|
|
* error. */
|
2019-11-23 20:27:39 +08:00
|
|
|
const ValueMapIntKey& asIntKeyMap() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if the Value is null.
|
|
|
|
* @return True if the Value is null, false if not.
|
|
|
|
*/
|
|
|
|
bool isNull() const { return _type == Type::NONE; }
|
|
|
|
|
|
|
|
/** Value type wrapped by Value. */
|
2021-11-09 14:29:15 +08:00
|
|
|
enum class Type : uint32_t
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
/// no value is wrapped, an empty Value
|
|
|
|
NONE = 0,
|
|
|
|
/// wrap integer
|
|
|
|
INTEGER,
|
|
|
|
/// wrap float
|
|
|
|
FLOAT,
|
|
|
|
/// wrap double
|
|
|
|
DOUBLE,
|
|
|
|
/// wrap bool
|
|
|
|
BOOLEAN,
|
|
|
|
/// wrap string
|
|
|
|
STRING,
|
|
|
|
/// wrap vector
|
|
|
|
VECTOR,
|
|
|
|
/// wrap ValueMap
|
|
|
|
MAP,
|
|
|
|
/// wrap ValueMapIntKey
|
2021-11-09 14:29:15 +08:00
|
|
|
INT_KEY_MAP,
|
|
|
|
|
|
|
|
MASK_UNSIGNED = 1 << 17,
|
|
|
|
MASK_64BIT = 1 << 18,
|
|
|
|
INT_I32 = INTEGER,
|
|
|
|
INT_UI32 = INTEGER | MASK_UNSIGNED,
|
|
|
|
INT_I64 = INTEGER | MASK_64BIT,
|
|
|
|
INT_UI64 = INTEGER | MASK_64BIT | MASK_UNSIGNED,
|
2019-11-23 20:27:39 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/** Gets the value type. */
|
|
|
|
Type getType() const { return _type; }
|
|
|
|
|
2021-11-09 14:29:15 +08:00
|
|
|
/** Gets the value type family. */
|
|
|
|
Type getTypeFamily() const { return (Type)((uint32_t)_type & 0xFFFFu); }
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** Gets the description of the class. */
|
|
|
|
std::string getDescription() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void clear();
|
|
|
|
void reset(Type type);
|
|
|
|
|
|
|
|
union
|
|
|
|
{
|
|
|
|
int intVal;
|
2021-11-09 12:16:27 +08:00
|
|
|
unsigned int uintVal;
|
2021-11-09 14:29:15 +08:00
|
|
|
int64_t int64Val;
|
|
|
|
uint64_t uint64Val;
|
2019-11-23 20:27:39 +08:00
|
|
|
float floatVal;
|
|
|
|
double doubleVal;
|
|
|
|
bool boolVal;
|
|
|
|
|
|
|
|
std::string* strVal;
|
|
|
|
ValueVector* vectorVal;
|
|
|
|
ValueMap* mapVal;
|
|
|
|
ValueMapIntKey* intKeyMapVal;
|
2021-12-25 10:04:45 +08:00
|
|
|
} _field;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
Type _type;
|
|
|
|
};
|
|
|
|
|
2021-12-26 23:26:34 +08:00
|
|
|
inline const cocos2d::Value& optValue(const ValueMap& dictionary, std::string_view key)
|
|
|
|
{
|
|
|
|
return dictionary.find(key) != dictionary.cend() ? dictionary.at(key) : cocos2d::Value::Null;
|
|
|
|
}
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
/** @} */
|
|
|
|
|
|
|
|
NS_CC_END
|
|
|
|
|
|
|
|
#endif /* defined(__cocos2d_libs__CCValue__) */
|