Commit bb0e8289 authored by miloyip's avatar miloyip

Some std::string overloads for Pointer

parent 0eb6cb8e
...@@ -42,61 +42,25 @@ public: ...@@ -42,61 +42,25 @@ public:
SizeType index; //!< A valid index if not equal to kPointerInvalidIndex. SizeType index; //!< A valid index if not equal to kPointerInvalidIndex.
}; };
GenericPointer() : GenericPointer() : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {}
allocator_(),
ownAllocator_(),
nameBuffer_(),
tokens_(),
tokenCount_(),
parseErrorOffset_(),
parseErrorCode_(kPointerParseErrorNone)
{
}
explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : explicit GenericPointer(const Ch* source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {
allocator_(allocator),
ownAllocator_(),
nameBuffer_(),
tokens_(),
tokenCount_(),
parseErrorOffset_(),
parseErrorCode_(kPointerParseErrorNone)
{
Parse(source, internal::StrLen(source)); Parse(source, internal::StrLen(source));
} }
GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : #if RAPIDJSON_HAS_STDSTRING
allocator_(allocator), explicit GenericPointer(const std::basic_string<Ch>& source, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {
ownAllocator_(), Parse(source.c_str(), source.size());
nameBuffer_(),
tokens_(),
tokenCount_(),
parseErrorOffset_(),
parseErrorCode_(kPointerParseErrorNone)
{
Parse(source, length);
} }
#endif
GenericPointer(const Token* tokens, size_t tokenCount) : GenericPointer(const Ch* source, size_t length, Allocator* allocator = 0) : allocator_(allocator), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {
allocator_(), Parse(source, length);
ownAllocator_(),
nameBuffer_(),
tokens_(const_cast<Token*>(tokens)),
tokenCount_(tokenCount),
parseErrorOffset_(),
parseErrorCode_(kPointerParseErrorNone)
{
} }
GenericPointer(const GenericPointer& rhs) : GenericPointer(const Token* tokens, size_t tokenCount) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(const_cast<Token*>(tokens)), tokenCount_(tokenCount), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {}
allocator_(),
ownAllocator_(), GenericPointer(const GenericPointer& rhs) : allocator_(), ownAllocator_(), nameBuffer_(), tokens_(), tokenCount_(), parseErrorOffset_(), parseErrorCode_(kPointerParseErrorNone) {
nameBuffer_(),
tokens_(),
tokenCount_(),
parseErrorOffset_(),
parseErrorCode_(kPointerParseErrorNone)
{
*this = rhs; *this = rhs;
} }
...@@ -255,9 +219,7 @@ public: ...@@ -255,9 +219,7 @@ public:
return v; return v;
} }
const ValueType* Get(const ValueType& root) const { const ValueType* Get(const ValueType& root) const { return Get(const_cast<ValueType&>(root)); }
return Get(const_cast<ValueType&>(root));
}
ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const { ValueType& GetWithDefault(ValueType& root, const ValueType& defaultValue, typename ValueType::AllocatorType& allocator) const {
bool alreadyExist; bool alreadyExist;
...@@ -284,6 +246,18 @@ public: ...@@ -284,6 +246,18 @@ public:
return v; return v;
} }
#if RAPIDJSON_HAS_STDSTRING
ValueType& GetWithDefault(ValueType& root, const std::basic_string<Ch>& defaultValue, typename ValueType::AllocatorType& allocator) const {
bool alreadyExist;
Value& v = Create(root, allocator, &alreadyExist);
if (!alreadyExist) {
Value clone(defaultValue, allocator); // This has overhead, so do it inside if.
v = clone;
}
return v;
}
#endif
template <typename T> template <typename T>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))
GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const { GetWithDefault(ValueType& root, T defaultValue, typename ValueType::AllocatorType& allocator) const {
...@@ -306,6 +280,13 @@ public: ...@@ -306,6 +280,13 @@ public:
return GetWithDefault(root, defaultValue, root.GetAllocator()); return GetWithDefault(root, defaultValue, root.GetAllocator());
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename stackAllocator>
ValueType& GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, const std::basic_string<Ch>& defaultValue) const {
return GetWithDefault(root, defaultValue, root.GetAllocator());
}
#endif
template <typename T, typename stackAllocator> template <typename T, typename stackAllocator>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))
GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, T defaultValue) const { GetWithDefault(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, T defaultValue) const {
...@@ -332,6 +313,13 @@ public: ...@@ -332,6 +313,13 @@ public:
return Create(root, allocator) = v; return Create(root, allocator) = v;
} }
#if RAPIDJSON_HAS_STDSTRING
ValueType& Set(ValueType& root, const std::basic_string<Ch>& value, typename ValueType::AllocatorType& allocator) const {
ValueType v(value, allocator);
return Create(root, allocator) = v;
}
#endif
template <typename T> template <typename T>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))
Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const { Set(ValueType& root, T value, typename ValueType::AllocatorType& allocator) const {
...@@ -351,21 +339,25 @@ public: ...@@ -351,21 +339,25 @@ public:
template <typename stackAllocator> template <typename stackAllocator>
ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, GenericStringRef<Ch> value) const { ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, GenericStringRef<Ch> value) const {
ValueType v(value); return Create(root) = value;
return Create(root) = v;
} }
template <typename stackAllocator> template <typename stackAllocator>
ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, const Ch* value) const { ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, const Ch* value) const {
ValueType v(value, root.GetAllocator()); return Create(root) = ValueType(value, root.GetAllocator()).Move();
return Create(root) = v; }
#if RAPIDJSON_HAS_STDSTRING
template <typename stackAllocator>
ValueType& Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, const std::basic_string<Ch>& value) const {
return Create(root) = ValueType(value, root.GetAllocator()).Move();
} }
#endif
template <typename T, typename stackAllocator> template <typename T, typename stackAllocator>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&))
Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, T value) const { Set(GenericDocument<EncodingType, typename ValueType::AllocatorType, stackAllocator>& root, T value) const {
ValueType v(value); return Create(root) = value;
return Create(root) = v;
} }
// Create parents if non-exist // Create parents if non-exist
...@@ -628,8 +620,7 @@ typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer<typena ...@@ -628,8 +620,7 @@ typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer<typena
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) { typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N], typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Create(root, a);
return CreateValueByPointer(root, pointer, a);
} }
// No allocator parameter // No allocator parameter
...@@ -641,8 +632,7 @@ typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer<typena ...@@ -641,8 +632,7 @@ typename T::ValueType& CreateValueByPointer(T& root, const GenericPointer<typena
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N]) { typename T::ValueType& CreateValueByPointer(T& root, const CharType(&source)[N]) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Create(root);
return CreateValueByPointer(root, pointer);
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -659,14 +649,12 @@ const typename T::ValueType* GetValueByPointer(const T& root, const GenericPoint ...@@ -659,14 +649,12 @@ const typename T::ValueType* GetValueByPointer(const T& root, const GenericPoint
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N]) { typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N]) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Get(root);
return GetValueByPointer(root, pointer);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N]) { const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N]) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Get(root);
return GetValueByPointer(root, pointer);
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -686,6 +674,13 @@ typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointe ...@@ -686,6 +674,13 @@ typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointe
return pointer.GetWithDefault(root, defaultValue, a); return pointer.GetWithDefault(root, defaultValue, a);
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename T>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& defaultValue, typename T::AllocatorType& a) {
return pointer.GetWithDefault(root, defaultValue, a);
}
#endif
template <typename T, typename T2> template <typename T, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 defaultValue, typename T::AllocatorType& a) { GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 defaultValue, typename T::AllocatorType& a) {
...@@ -694,27 +689,30 @@ GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType ...@@ -694,27 +689,30 @@ GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);
return GetValueByPointerWithDefault(root, pointer, defaultValue, a);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> defaultValue, typename T::AllocatorType& a) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> defaultValue, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);
return GetValueByPointerWithDefault(root, pointer, defaultValue, a);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);
return GetValueByPointerWithDefault(root, pointer, defaultValue, a); }
#if RAPIDJSON_HAS_STDSTRING
template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& defaultValue, typename T::AllocatorType& a) {
return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);
} }
#endif
template <typename T, typename CharType, size_t N, typename T2> template <typename T, typename CharType, size_t N, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) { GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue, a);
return GetValueByPointerWithDefault(root, pointer, defaultValue, a);
} }
// No allocator parameter // No allocator parameter
...@@ -734,6 +732,13 @@ typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointe ...@@ -734,6 +732,13 @@ typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointe
return pointer.GetWithDefault(root, defaultValue); return pointer.GetWithDefault(root, defaultValue);
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename T>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& defaultValue) {
return pointer.GetWithDefault(root, defaultValue);
}
#endif
template <typename T, typename T2> template <typename T, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 defaultValue) { GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 defaultValue) {
...@@ -742,27 +747,30 @@ GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType ...@@ -742,27 +747,30 @@ GetValueByPointerWithDefault(T& root, const GenericPointer<typename T::ValueType
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::ValueType& defaultValue) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue);
return GetValueByPointerWithDefault(root, pointer, defaultValue);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> defaultValue) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> defaultValue) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue);
return GetValueByPointerWithDefault(root, pointer, defaultValue);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue) { typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const typename T::Ch* defaultValue) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue);
return GetValueByPointerWithDefault(root, pointer, defaultValue);
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename T, typename CharType, size_t N>
typename T::ValueType& GetValueByPointerWithDefault(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& defaultValue) {
return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue);
}
#endif
template <typename T, typename CharType, size_t N, typename T2> template <typename T, typename CharType, size_t N, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue) { GetValueByPointerWithDefault(T& root, const CharType(&source)[N], T2 defaultValue) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).GetWithDefault(root, defaultValue);
return GetValueByPointerWithDefault(root, pointer, defaultValue);
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -782,6 +790,13 @@ typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename ...@@ -782,6 +790,13 @@ typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename
return pointer.Set(root, value, a); return pointer.Set(root, value, a);
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename T>
typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& value, typename T::AllocatorType& a) {
return pointer.Set(root, value, a);
}
#endif
template <typename T, typename T2> template <typename T, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 value, typename T::AllocatorType& a) { SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 value, typename T::AllocatorType& a) {
...@@ -790,27 +805,30 @@ SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, ...@@ -790,27 +805,30 @@ SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer,
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);
return SetValueByPointer(root, pointer, value, a);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> value, typename T::AllocatorType& a) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> value, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);
return SetValueByPointer(root, pointer, value, a);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);
return SetValueByPointer(root, pointer, value, a); }
#if RAPIDJSON_HAS_STDSTRING
template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& value, typename T::AllocatorType& a) {
return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);
} }
#endif
template <typename T, typename CharType, size_t N, typename T2> template <typename T, typename CharType, size_t N, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) { SetValueByPointer(T& root, const CharType(&source)[N], T2 value, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value, a);
return SetValueByPointer(root, pointer, value, a);
} }
// No allocator parameter // No allocator parameter
...@@ -830,6 +848,13 @@ typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename ...@@ -830,6 +848,13 @@ typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename
return pointer.Set(root, value); return pointer.Set(root, value);
} }
#if RAPIDJSON_HAS_STDSTRING
template <typename T>
typename T::ValueType& SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, const std::basic_string<typename T::Ch>& value) {
return pointer.Set(root, value);
}
#endif
template <typename T, typename T2> template <typename T, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 value) { SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, T2 value) {
...@@ -838,27 +863,30 @@ SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, ...@@ -838,27 +863,30 @@ SetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer,
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value);
return SetValueByPointer(root, pointer, value);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> value) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], GenericStringRef<typename T::Ch> value) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value);
return SetValueByPointer(root, pointer, value);
} }
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value) { typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const typename T::Ch* value) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value);
return SetValueByPointer(root, pointer, value); }
#if RAPIDJSON_HAS_STDSTRING
template <typename T, typename CharType, size_t N>
typename T::ValueType& SetValueByPointer(T& root, const CharType(&source)[N], const std::basic_string<typename T::Ch>& value) {
return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value);
} }
#endif
template <typename T, typename CharType, size_t N, typename T2> template <typename T, typename CharType, size_t N, typename T2>
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&)) RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T2>, internal::IsGenericValue<T2> >), (typename T::ValueType&))
SetValueByPointer(T& root, const CharType(&source)[N], T2 value) { SetValueByPointer(T& root, const CharType(&source)[N], T2 value) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Set(root, value);
return SetValueByPointer(root, pointer, value);
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -870,8 +898,7 @@ typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer<typename ...@@ -870,8 +898,7 @@ typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer<typename
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) { typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value, typename T::AllocatorType& a) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Swap(root, value, a);
return SwapValueByPointer(root, pointer, value, a);
} }
template <typename T> template <typename T>
...@@ -881,8 +908,7 @@ typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer<typename ...@@ -881,8 +908,7 @@ typename T::ValueType& SwapValueByPointer(T& root, const GenericPointer<typename
template <typename T, typename CharType, size_t N> template <typename T, typename CharType, size_t N>
typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value) { typename T::ValueType& SwapValueByPointer(T& root, const CharType(&source)[N], typename T::ValueType& value) {
const GenericPointer<typename T::ValueType> pointer(source, N - 1); return GenericPointer<typename T::ValueType>(source, N - 1).Swap(root, value);
return SwapValueByPointer(root, pointer, value);
} }
RAPIDJSON_NAMESPACE_END RAPIDJSON_NAMESPACE_END
......
...@@ -22,6 +22,8 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") ...@@ -22,6 +22,8 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRAPIDJSON_HAS_STDSTRING=1")
add_library(namespacetest STATIC namespacetest.cpp) add_library(namespacetest STATIC namespacetest.cpp)
add_executable(unittest ${UNITTEST_SOURCES}) add_executable(unittest ${UNITTEST_SOURCES})
......
...@@ -53,6 +53,16 @@ TEST(Pointer, Parse) { ...@@ -53,6 +53,16 @@ TEST(Pointer, Parse) {
EXPECT_STREQ("foo", p.GetTokens()[0].name); EXPECT_STREQ("foo", p.GetTokens()[0].name);
} }
#if RAPIDJSON_HAS_STDSTRING
{
Pointer p(std::string("/foo"));
EXPECT_TRUE(p.IsValid());
EXPECT_EQ(1u, p.GetTokenCount());
EXPECT_EQ(3u, p.GetTokens()[0].length);
EXPECT_STREQ("foo", p.GetTokens()[0].name);
}
#endif
{ {
Pointer p("/foo/0"); Pointer p("/foo/0");
EXPECT_TRUE(p.IsValid()); EXPECT_TRUE(p.IsValid());
...@@ -611,6 +621,10 @@ TEST(Pointer, GetWithDefault) { ...@@ -611,6 +621,10 @@ TEST(Pointer, GetWithDefault) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", Pointer("/foo/C++").GetWithDefault(d, std::string("C++"), a).GetString());
#endif
} }
TEST(Pointer, GetWithDefault_NoAllocator) { TEST(Pointer, GetWithDefault_NoAllocator) {
...@@ -659,6 +673,10 @@ TEST(Pointer, GetWithDefault_NoAllocator) { ...@@ -659,6 +673,10 @@ TEST(Pointer, GetWithDefault_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", Pointer("/foo/C++").GetWithDefault(d, std::string("C++")).GetString());
#endif
} }
TEST(Pointer, Set) { TEST(Pointer, Set) {
...@@ -709,6 +727,11 @@ TEST(Pointer, Set) { ...@@ -709,6 +727,11 @@ TEST(Pointer, Set) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
Pointer("/foo/c++").Set(d, std::string("C++"), a);
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, Set_NoAllocator) { TEST(Pointer, Set_NoAllocator) {
...@@ -758,6 +781,11 @@ TEST(Pointer, Set_NoAllocator) { ...@@ -758,6 +781,11 @@ TEST(Pointer, Set_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
Pointer("/foo/c++").Set(d, std::string("C++"));
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, Swap) { TEST(Pointer, Swap) {
...@@ -864,6 +892,10 @@ TEST(Pointer, GetValueByPointerWithDefault_Pointer) { ...@@ -864,6 +892,10 @@ TEST(Pointer, GetValueByPointerWithDefault_Pointer) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++"), a).GetString());
#endif
} }
TEST(Pointer, GetValueByPointerWithDefault_String) { TEST(Pointer, GetValueByPointerWithDefault_String) {
...@@ -913,6 +945,10 @@ TEST(Pointer, GetValueByPointerWithDefault_String) { ...@@ -913,6 +945,10 @@ TEST(Pointer, GetValueByPointerWithDefault_String) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, "/foo/C++", std::string("C++"), a).GetString());
#endif
} }
TEST(Pointer, GetValueByPointerWithDefault_Pointer_NoAllocator) { TEST(Pointer, GetValueByPointerWithDefault_Pointer_NoAllocator) {
...@@ -961,6 +997,10 @@ TEST(Pointer, GetValueByPointerWithDefault_Pointer_NoAllocator) { ...@@ -961,6 +997,10 @@ TEST(Pointer, GetValueByPointerWithDefault_Pointer_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, Pointer("/foo/world"))->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++")).GetString());
#endif
} }
TEST(Pointer, GetValueByPointerWithDefault_String_NoAllocator) { TEST(Pointer, GetValueByPointerWithDefault_String_NoAllocator) {
...@@ -1009,6 +1049,10 @@ TEST(Pointer, GetValueByPointerWithDefault_String_NoAllocator) { ...@@ -1009,6 +1049,10 @@ TEST(Pointer, GetValueByPointerWithDefault_String_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
EXPECT_STREQ("C++", GetValueByPointerWithDefault(d, Pointer("/foo/C++"), std::string("C++")).GetString());
#endif
} }
TEST(Pointer, SetValueByPointer_Pointer) { TEST(Pointer, SetValueByPointer_Pointer) {
...@@ -1056,6 +1100,11 @@ TEST(Pointer, SetValueByPointer_Pointer) { ...@@ -1056,6 +1100,11 @@ TEST(Pointer, SetValueByPointer_Pointer) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
SetValueByPointer(d, Pointer("/foo/c++"), std::string("C++"), a);
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, SetValueByPointer_String) { TEST(Pointer, SetValueByPointer_String) {
...@@ -1103,6 +1152,11 @@ TEST(Pointer, SetValueByPointer_String) { ...@@ -1103,6 +1152,11 @@ TEST(Pointer, SetValueByPointer_String) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
SetValueByPointer(d, "/foo/c++", std::string("C++"), a);
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, SetValueByPointer_Pointer_NoAllocator) { TEST(Pointer, SetValueByPointer_Pointer_NoAllocator) {
...@@ -1149,6 +1203,11 @@ TEST(Pointer, SetValueByPointer_Pointer_NoAllocator) { ...@@ -1149,6 +1203,11 @@ TEST(Pointer, SetValueByPointer_Pointer_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
SetValueByPointer(d, Pointer("/foo/c++"), std::string("C++"));
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, SetValueByPointer_String_NoAllocator) { TEST(Pointer, SetValueByPointer_String_NoAllocator) {
...@@ -1195,6 +1254,11 @@ TEST(Pointer, SetValueByPointer_String_NoAllocator) { ...@@ -1195,6 +1254,11 @@ TEST(Pointer, SetValueByPointer_String_NoAllocator) {
memset(buffer, 0, sizeof(buffer)); memset(buffer, 0, sizeof(buffer));
} }
EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString()); EXPECT_STREQ("World", GetValueByPointer(d, "/foo/world")->GetString());
#if RAPIDJSON_HAS_STDSTRING
SetValueByPointer(d, "/foo/c++", std::string("C++"));
EXPECT_STREQ("C++", GetValueByPointer(d, "/foo/c++")->GetString());
#endif
} }
TEST(Pointer, SwapValueByPointer) { TEST(Pointer, SwapValueByPointer) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment