CCValue ==

//CCValue.cpp中

bool Value::operator== (const Value& v) const
{
if (this == &v) return true;
if (v._type != this->_type) return false;
if (this->isNull()) return true; //this为空时就直接return true?
switch (_type)
{
case Type::BYTE: return v._field.byteVal == this->_field.byteVal;
case Type::INTEGER: return v._field.intVal == this->_field.intVal;
case Type::BOOLEAN: return v._field.boolVal == this->_field.boolVal;
case Type::STRING: return *v._field.strVal == *this->_field.strVal;
case Type::FLOAT: return fabs(v._field.floatVal - this->_field.floatVal) <= FLT_EPSILON;
case Type::DOUBLE: return fabs(v._field.doubleVal - this->_field.doubleVal) <= FLT_EPSILON;
case Type::VECTOR:
{
const auto &v1 = (this->_field.vectorVal);
const auto &v2 = (v._field.vectorVal);
const auto size = v1.size();
if (size == v2.size()) //else return true?
{
for (size_t i = 0; i < size; i++)
{
if (v1
!= v2
) return false;
}
}
return true;
}
case Type::map:
{

    const auto &map1 = *(this->_field.mapVal);
    const auto &map2 = *(v._field.mapVal);                     //map的比较也要先比一下size吧?*
    for (const auto &kvp : map1)
    {
        auto it = map2.find(kvp.first);
        if (it == map2.end() || it->second != kvp.second)
        {
            return false;
        }
    }
    return true;
}
case Type::INT_KEY_MAP:
{
    const auto &map1 = *(this->_field.intKeyMapVal);
    const auto &map2 = *(v._field.intKeyMapVal);
    for (const auto &kvp : map1)
    {
        auto it = map2.find(kvp.first);
        if (it == map2.end() || it->second != kvp.second)
        {
            return false;
        }
    }
    return true;
}
default:
    break;
};

return false;

}
*