15 #ifndef RAPIDJSON_POINTER_H_
16 #define RAPIDJSON_POINTER_H_
25 RAPIDJSON_DIAG_OFF(
switch -
enum)
26 #elif defined(_MSC_VER)
28 RAPIDJSON_DIAG_OFF(4512)
31 #if defined(RAPIDJSON_CPLUSPLUS) && RAPIDJSON_CPLUSPLUS >= 201703L
32 #define RAPIDJSON_IF_CONSTEXPR if constexpr
34 #define RAPIDJSON_IF_CONSTEXPR if
39 static const SizeType kPointerInvalidIndex =
74 template <
typename ValueType,
typename Allocator = CrtAllocator>
79 typedef typename ValueType::Ch
Ch;
136 #if RAPIDJSON_HAS_STDSTRING
313 Ch* p = r.CopyFromRaw(*
this, 1, token.
length + 1);
314 std::memcpy(p, token.
name, (token.
length + 1) *
sizeof(
Ch));
330 Token token = {name, length, kPointerInvalidIndex};
340 template <
typename T>
349 #if RAPIDJSON_HAS_STDSTRING
374 buffer[length] =
'\0';
378 Token token = {
reinterpret_cast<Ch*
>(buffer), length, index};
384 for(
size_t i = 0; i <= length; i++)
385 name[i] =
static_cast<Ch>(buffer[i]);
386 Token token = {name, length, index};
430 const Token* GetTokens()
const {
return tokens_; }
433 size_t GetTokenCount()
const {
return tokenCount_; }
492 if(
int cmp = std::memcmp(
510 template <
typename OutputStream>
511 bool Stringify(OutputStream& os)
const
513 return Stringify<false, OutputStream>(os);
521 template <
typename OutputStream>
522 bool StringifyUriFragment(OutputStream& os)
const
524 return Stringify<true, OutputStream>(os);
548 ValueType& Create(ValueType& root,
549 typename ValueType::AllocatorType&
allocator,
550 bool* alreadyExist = 0)
const
553 ValueType* v = &root;
557 if(v->IsArray() && t->name[0] ==
'-' && t->length == 1)
559 v->PushBack(ValueType().Move(),
allocator);
560 v = &((*v)[v->Size() - 1]);
565 if(t->index == kPointerInvalidIndex)
572 if(!v->IsArray() && !v->IsObject())
578 if(t->index >= v->Size())
581 while(t->index >= v->Size())
582 v->PushBack(ValueType().Move(),
allocator);
585 v = &((*v)[t->index]);
589 typename ValueType::MemberIterator m = v->FindMember(
591 if(m == v->MemberEnd())
593 v->AddMember(ValueType(t->name, t->length,
allocator).Move(),
607 *alreadyExist = exist;
618 template <
typename stackAllocator>
621 bool* alreadyExist = 0)
const
623 return Create(document, document.
GetAllocator(), alreadyExist);
648 UriType GetUri(ValueType& root,
650 size_t* unresolvedTokenIndex = 0,
653 static const Ch kIdString[] = {
'i',
'd',
'\0'};
654 static const ValueType kIdValue(kIdString, 2);
657 ValueType* v = &root;
664 typename ValueType::MemberIterator m = v->FindMember(kIdValue);
665 if(m != v->MemberEnd() && (m->value).IsString())
672 if(m == v->MemberEnd())
678 if(t->index == kPointerInvalidIndex || t->index >= v->Size())
680 v = &((*v)[t->index]);
686 if(unresolvedTokenIndex)
687 *unresolvedTokenIndex =
static_cast<size_t>(t -
tokens_);
693 UriType GetUri(
const ValueType& root,
695 size_t* unresolvedTokenIndex = 0,
698 return GetUri(
const_cast<ValueType&
>(root), rootUri, unresolvedTokenIndex,
allocator);
719 ValueType* Get(ValueType& root,
size_t* unresolvedTokenIndex = 0)
const
722 ValueType* v = &root;
728 typename ValueType::MemberIterator m = v->FindMember(
730 if(m == v->MemberEnd())
736 if(t->index == kPointerInvalidIndex || t->index >= v->Size())
738 v = &((*v)[t->index]);
744 if(unresolvedTokenIndex)
745 *unresolvedTokenIndex =
static_cast<size_t>(t -
tokens_);
756 const ValueType* Get(
const ValueType& root,
size_t* unresolvedTokenIndex = 0)
const
758 return Get(
const_cast<ValueType&
>(root), unresolvedTokenIndex);
776 ValueType& GetWithDefault(ValueType& root,
778 typename ValueType::AllocatorType&
allocator)
const
781 ValueType& v = Create(root,
allocator, &alreadyExist);
786 ValueType& GetWithDefault(ValueType& root,
788 typename ValueType::AllocatorType&
allocator)
const
791 ValueType& v = Create(root,
allocator, &alreadyExist);
795 #if RAPIDJSON_HAS_STDSTRING
797 ValueType& GetWithDefault(ValueType& root,
799 typename ValueType::AllocatorType&
allocator)
const
802 ValueType& v = Create(root,
allocator, &alreadyExist);
811 template <
typename T>
814 GetWithDefault(ValueType& root,
816 typename ValueType::AllocatorType&
allocator)
const
822 template <
typename stackAllocator>
823 ValueType& GetWithDefault(
831 template <
typename stackAllocator>
832 ValueType& GetWithDefault(
839 #if RAPIDJSON_HAS_STDSTRING
841 template <
typename stackAllocator>
842 ValueType& GetWithDefault(
854 template <
typename T,
typename stackAllocator>
879 Set(ValueType& root, ValueType&
value,
typename ValueType::AllocatorType&
allocator)
const
886 Set(ValueType& root,
const ValueType&
value,
typename ValueType::AllocatorType&
allocator)
const
898 #if RAPIDJSON_HAS_STDSTRING
900 ValueType&
Set(ValueType& root,
901 const std::basic_string<Ch>&
value,
902 typename ValueType::AllocatorType&
allocator)
const
912 template <
typename T>
915 Set(ValueType& root, T
value,
typename ValueType::AllocatorType&
allocator)
const
921 template <
typename stackAllocator>
924 ValueType&
value)
const
926 return Create(document) =
value;
930 template <
typename stackAllocator>
933 const ValueType&
value)
const
939 template <
typename stackAllocator>
947 #if RAPIDJSON_HAS_STDSTRING
949 template <
typename stackAllocator>
952 const std::basic_string<Ch>&
value)
const
962 template <
typename T,
typename stackAllocator>
968 return Create(document) =
value;
986 Swap(ValueType& root, ValueType&
value,
typename ValueType::AllocatorType&
allocator)
const
992 template <
typename stackAllocator>
995 ValueType&
value)
const
1010 bool Erase(ValueType& root)
const
1016 ValueType* v = &root;
1018 for(
const Token* t =
tokens_; t != last; ++t)
1020 switch(v->GetType())
1023 typename ValueType::MemberIterator m = v->FindMember(
1025 if(m == v->MemberEnd())
1031 if(t->index == kPointerInvalidIndex || t->index >= v->Size())
1033 v = &((*v)[t->index]);
1035 default:
return false;
1039 switch(v->GetType())
1043 if(last->index == kPointerInvalidIndex || last->index >= v->Size())
1045 v->Erase(v->Begin() + last->index);
1047 default:
return false;
1060 CopyFromRaw(
const GenericPointer& rhs,
size_t extraToken = 0,
size_t extraNameBufferSize = 0)
1067 nameBufferSize += t->length;
1071 tokenCount_ *
sizeof(Token) + (nameBufferSize + extraNameBufferSize) *
sizeof(
Ch)));
1077 if(nameBufferSize > 0)
1102 bool NeedPercentEncode(
Ch c)
const
1104 return !((c >=
'0' && c <=
'9') || (c >=
'A' && c <=
'Z') || (c >=
'a' && c <=
'z') ||
1105 c ==
'-' || c ==
'.' || c ==
'_' || c ==
'~');
1116 void Parse(
const Ch*
source,
size_t length)
1132 Token* token =
tokens_ =
static_cast<Token*
>(
1138 bool uriFragment =
false;
1145 if(i != length &&
source[i] !=
'/')
1157 bool isNumber =
true;
1159 while(i < length &&
source[i] !=
'/')
1169 Ch* begin = os.PutBegin();
1175 size_t len = os.PutEnd(begin);
1187 else if(NeedPercentEncode(c))
1221 if(c < '0' || c >
'9')
1226 token->length =
static_cast<SizeType>(name - token->name);
1227 if(token->length == 0)
1232 if(isNumber && token->length > 1 && token->name[0] ==
'0')
1239 for(
size_t j = 0; j < token->length; j++)
1251 token->index = isNumber ? n : kPointerInvalidIndex;
1273 template <
bool uriFragment,
typename OutputStream>
1274 bool Stringify(OutputStream& os)
const
1284 for(
size_t j = 0; j < t->length; j++)
1297 else if(uriFragment && NeedPercentEncode(c))
1301 PercentEncodeStream<OutputStream> target(os);
1319 class PercentDecodeStream
1322 typedef typename ValueType::Ch
Ch;
1329 PercentDecodeStream(
const Ch*
source,
const Ch* end)
1336 if(*src_ !=
'%' || src_ + 3 > end_)
1343 for(
int j = 0; j < 2; j++)
1345 c =
static_cast<Ch>(c << 4);
1347 if(h >=
'0' && h <=
'9')
1348 c =
static_cast<Ch>(c + h -
'0');
1349 else if(h >=
'A' && h <=
'F')
1350 c =
static_cast<Ch>(c + h -
'A' + 10);
1351 else if(h >=
'a' && h <=
'f')
1352 c =
static_cast<Ch>(c + h -
'a' + 10);
1363 size_t Tell()
const {
return static_cast<size_t>(src_ - head_); }
1364 bool IsValid()
const {
return valid_; }
1374 template <
typename OutputStream>
1381 unsigned char u =
static_cast<unsigned char>(c);
1382 static const char hexDigits[16] = {
1383 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F'};
1385 os_.Put(
static_cast<typename OutputStream::Ch
>(hexDigits[u >> 4]));
1386 os_.Put(
static_cast<typename OutputStream::Ch
>(hexDigits[u & 15]));
1411 template <
typename T>
1414 typename T::AllocatorType&
a)
1419 template <
typename T,
typename CharType,
size_t N>
1420 typename T::ValueType&
1428 template <
typename DocumentType>
1429 typename DocumentType::ValueType&
1433 return pointer.Create(document);
1436 template <
typename DocumentType,
typename CharType,
size_t N>
1438 const CharType (&
source)[N])
1445 template <
typename T>
1448 size_t* unresolvedTokenIndex = 0)
1450 return pointer.Get(root, unresolvedTokenIndex);
1453 template <
typename T>
1456 size_t* unresolvedTokenIndex = 0)
1458 return pointer.Get(root, unresolvedTokenIndex);
1461 template <
typename T,
typename CharType,
size_t N>
1462 typename T::ValueType*
1468 template <
typename T,
typename CharType,
size_t N>
1469 const typename T::ValueType*
1477 template <
typename T>
1478 typename T::ValueType&
1482 typename T::AllocatorType&
a)
1487 template <
typename T>
1488 typename T::ValueType&
1492 typename T::AllocatorType&
a)
1497 #if RAPIDJSON_HAS_STDSTRING
1498 template <
typename T>
1499 typename T::ValueType&
1503 typename T::AllocatorType&
a)
1509 template <
typename T,
typename T2>
1512 (
typename T::ValueType&))
1516 typename T::AllocatorType&
a)
1521 template <
typename T,
typename CharType,
size_t N>
1523 const CharType (&
source)[N],
1525 typename T::AllocatorType&
a)
1531 template <
typename T,
typename CharType,
size_t N>
1533 const CharType (&
source)[N],
1535 typename T::AllocatorType&
a)
1541 #if RAPIDJSON_HAS_STDSTRING
1542 template <
typename T,
typename CharType,
size_t N>
1543 typename T::ValueType&
1545 const CharType (&
source)[N],
1547 typename T::AllocatorType&
a)
1554 template <
typename T,
typename CharType,
size_t N,
typename T2>
1557 (
typename T::ValueType&))
1561 typename T::AllocatorType&
a)
1569 template <
typename DocumentType>
1570 typename DocumentType::ValueType&
1578 template <
typename DocumentType>
1579 typename DocumentType::ValueType&
1587 #if RAPIDJSON_HAS_STDSTRING
1588 template <
typename DocumentType>
1589 typename DocumentType::ValueType&
1592 const std::basic_string<typename DocumentType::Ch>&
defaultValue)
1598 template <
typename DocumentType,
typename T2>
1601 (
typename DocumentType::ValueType&))
1609 template <
typename DocumentType,
typename CharType,
size_t N>
1610 typename DocumentType::ValueType&
1612 const CharType (&
source)[N],
1619 template <
typename DocumentType,
typename CharType,
size_t N>
1620 typename DocumentType::ValueType&
1622 const CharType (&
source)[N],
1629 #if RAPIDJSON_HAS_STDSTRING
1630 template <
typename DocumentType,
typename CharType,
size_t N>
1631 typename DocumentType::ValueType&
1633 const CharType (&
source)[N],
1634 const std::basic_string<typename DocumentType::Ch>&
defaultValue)
1641 template <
typename DocumentType,
typename CharType,
size_t N,
typename T2>
1644 (
typename DocumentType::ValueType&))
1653 template <
typename T>
1656 typename T::ValueType&
value,
1657 typename T::AllocatorType&
a)
1662 template <
typename T>
1665 const typename T::ValueType&
value,
1666 typename T::AllocatorType&
a)
1671 template <
typename T>
1674 const typename T::Ch*
value,
1675 typename T::AllocatorType&
a)
1680 #if RAPIDJSON_HAS_STDSTRING
1681 template <
typename T>
1684 const std::basic_string<typename T::Ch>&
value,
1685 typename T::AllocatorType&
a)
1691 template <
typename T,
typename T2>
1694 (
typename T::ValueType&))
1698 typename T::AllocatorType&
a)
1703 template <
typename T,
typename CharType,
size_t N>
1705 const CharType (&
source)[N],
1706 typename T::ValueType&
value,
1707 typename T::AllocatorType&
a)
1712 template <
typename T,
typename CharType,
size_t N>
1714 const CharType (&
source)[N],
1715 const typename T::ValueType&
value,
1716 typename T::AllocatorType&
a)
1721 template <
typename T,
typename CharType,
size_t N>
1723 const CharType (&
source)[N],
1724 const typename T::Ch*
value,
1725 typename T::AllocatorType&
a)
1730 #if RAPIDJSON_HAS_STDSTRING
1731 template <
typename T,
typename CharType,
size_t N>
1733 const CharType (&
source)[N],
1734 const std::basic_string<typename T::Ch>&
value,
1735 typename T::AllocatorType&
a)
1741 template <
typename T,
typename CharType,
size_t N,
typename T2>
1744 (
typename T::ValueType&))
1752 template <
typename DocumentType>
1753 typename DocumentType::ValueType&
1756 typename DocumentType::ValueType&
value)
1761 template <
typename DocumentType>
1762 typename DocumentType::ValueType&
1765 const typename DocumentType::ValueType&
value)
1770 template <
typename DocumentType>
1771 typename DocumentType::ValueType&
1774 const typename DocumentType::Ch*
value)
1779 #if RAPIDJSON_HAS_STDSTRING
1780 template <
typename DocumentType>
1781 typename DocumentType::ValueType&
1784 const std::basic_string<typename DocumentType::Ch>&
value)
1790 template <
typename DocumentType,
typename T2>
1793 (
typename DocumentType::ValueType&))
1801 template <
typename DocumentType,
typename CharType,
size_t N>
1803 const CharType (&
source)[N],
1804 typename DocumentType::ValueType&
value)
1809 template <
typename DocumentType,
typename CharType,
size_t N>
1811 const CharType (&
source)[N],
1812 const typename DocumentType::ValueType&
value)
1817 template <
typename DocumentType,
typename CharType,
size_t N>
1819 const CharType (&
source)[N],
1820 const typename DocumentType::Ch*
value)
1825 #if RAPIDJSON_HAS_STDSTRING
1826 template <
typename DocumentType,
typename CharType,
size_t N>
1827 typename DocumentType::ValueType&
1829 const CharType (&
source)[N],
1830 const std::basic_string<typename DocumentType::Ch>&
value)
1836 template <
typename DocumentType,
typename CharType,
size_t N,
typename T2>
1839 (
typename DocumentType::ValueType&))
1847 template <
typename T>
1850 typename T::ValueType&
value,
1851 typename T::AllocatorType&
a)
1856 template <
typename T,
typename CharType,
size_t N>
1858 const CharType (&
source)[N],
1859 typename T::ValueType&
value,
1860 typename T::AllocatorType&
a)
1865 template <
typename DocumentType>
1866 typename DocumentType::ValueType&
1869 typename DocumentType::ValueType&
value)
1874 template <
typename DocumentType,
typename CharType,
size_t N>
1876 const CharType (&
source)[N],
1877 typename DocumentType::ValueType&
value)
1884 template <
typename T>
1890 template <
typename T,
typename CharType,
size_t N>
1900 #if defined(__clang__) || defined(_MSC_VER)
void Free(A &a, T *p, size_t n=1)
Definition: allocators.h:485
A document for parsing JSON text as DOM.
Definition: document.h:3143
Allocator & GetAllocator()
Get the allocator of this document.
Definition: document.h:3472
A helper stream to encode character (UTF-8 code unit) into percent-encoded sequence.
Definition: pointer.h:1376
PercentEncodeStream(OutputStream &os)
Definition: pointer.h:1378
void Put(char c)
Definition: pointer.h:1379
Represents a JSON Pointer. Use Pointer for UTF8 encoding and default allocator.
Definition: pointer.h:76
GenericPointer & operator=(const GenericPointer &rhs)
Assignment operator.
Definition: pointer.h:246
friend void swap(GenericPointer &a, GenericPointer &b) RAPIDJSON_NOEXCEPT
free-standing swap function helper
Definition: pointer.h:296
Ch * nameBuffer_
A buffer containing all names in tokens.
Definition: pointer.h:1396
Allocator * allocator_
Definition: pointer.h:1393
RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr< internal::IsSame< typename internal::RemoveConst< T >::Type, Ch >>),(GenericPointer)) Append(T *name
Append a name token without length, and return a new Pointer.
GenericPointer(const GenericPointer &rhs, Allocator *allocator)
Copy constructor.
Definition: pointer.h:224
GenericPointer(const Ch *source, Allocator *allocator=0)
Constructor that parses a string or URI fragment representation.
Definition: pointer.h:124
ValueType::EncodingType EncodingType
Encoding type from Value.
Definition: pointer.h:78
GenericPointer(const Token *tokens, size_t tokenCount)
Constructor with user-supplied tokens.
Definition: pointer.h:199
GenericPointer(Allocator *allocator=0)
Default constructor.
Definition: pointer.h:107
GenericPointer & Swap(GenericPointer &other) RAPIDJSON_NOEXCEPT
Swap the content of this pointer with an other.
Definition: pointer.h:274
size_t tokenCount_
Number of tokens in tokens_.
Definition: pointer.h:1398
GenericPointer(const GenericPointer &rhs)
Copy constructor.
Definition: pointer.h:211
PointerParseErrorCode parseErrorCode_
Parsing error code.
Definition: pointer.h:1400
Token * tokens_
A list of tokens.
Definition: pointer.h:1397
Allocator * ownAllocator_
Allocator owned by this Pointer.
Definition: pointer.h:1395
GenericPointer(const Ch *source, size_t length, Allocator *allocator=0)
Definition: pointer.h:165
GenericPointer Append(const Ch *name, SizeType length, Allocator *allocator=0) const
Append a name token with length, and return a new Pointer.
Definition: pointer.h:328
GenericPointer Append(const Token &token, Allocator *allocator=0) const
Append a token and return a new Pointer.
Definition: pointer.h:309
ValueType::Ch Ch
Character type from Value.
Definition: pointer.h:79
GenericUri< ValueType, Allocator > UriType
Definition: pointer.h:80
~GenericPointer()
Destructor.
Definition: pointer.h:237
size_t parseErrorOffset_
Offset in code unit when parsing fail.
Definition: pointer.h:1399
Allocator * allocator
Definition: pointer.h:344
Represents a JSON value. Use Value for UTF8 encoding and default allocator.
Definition: document.h:822
Concept for allocating, resizing and freeing memory block.
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:451
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition: rapidjson.h:121
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition: rapidjson.h:124
PointerParseErrorCode
Error code of JSON pointer parsing.
Definition: error.h:277
@ kPointerParseErrorInvalidEscape
Invalid escape.
Definition: error.h:281
@ kPointerParseErrorTokenMustBeginWithSolidus
A token must begin with a '/'.
Definition: error.h:280
@ kPointerParseErrorNone
The parse is successful.
Definition: error.h:278
@ kPointerParseErrorCharacterMustPercentEncode
Definition: error.h:283
@ kPointerParseErrorInvalidPercentEncoding
Invalid percent encoding in URI fragment.
Definition: error.h:282
constexpr CK_TILE_HOST_DEVICE bool operator!=(const array< T, Size > &a, const array< T, Size > &b)
Definition: array.hpp:280
__host__ constexpr __device__ bool operator==(Sequence< Xs... >, Sequence< Ys... >)
Definition: sequence.hpp:649
void Swap(T &a, T &b) RAPIDJSON_NOEXCEPT
Custom swap() to avoid dependency on C++ <algorithm> header.
Definition: swap.h:33
char * u32toa(uint32_t value, char *buffer)
Definition: itoa.h:41
SizeType StrLen(const Ch *s)
Custom strlen() which works on different character types.
Definition: strfunc.h:32
char * u64toa(uint64_t value, char *buffer)
Definition: itoa.h:135
RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr< internal::IsPointer< T2 >, internal::IsGenericValue< T2 >>),(typename T::ValueType &)) GetValueByPointerWithDefault(T &root
T::ValueType * GetValueByPointer(T &root, const GenericPointer< typename T::ValueType > &pointer, size_t *unresolvedTokenIndex=0)
Definition: pointer.h:1446
T::ValueType & GetValueByPointerWithDefault(T &root, const GenericPointer< typename T::ValueType > &pointer, const typename T::ValueType &defaultValue, typename T::AllocatorType &a)
Definition: pointer.h:1479
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1697
const GenericPointer< typename T::ValueType > T2 defaultValue
Definition: pointer.h:1515
#define RAPIDJSON_IF_CONSTEXPR
Definition: pointer.h:34
bool EraseValueByPointer(T &root, const GenericPointer< typename T::ValueType > &pointer)
Definition: pointer.h:1885
GenericPointer< Value > Pointer
GenericPointer for Value (UTF-8, default allocator).
Definition: pointer.h:1404
T::ValueType & SetValueByPointer(T &root, const GenericPointer< typename T::ValueType > &pointer, typename T::ValueType &value, typename T::AllocatorType &a)
Definition: pointer.h:1654
const GenericPointer< typename T::ValueType > & pointer
Definition: pointer.h:1514
T::ValueType & SwapValueByPointer(T &root, const GenericPointer< typename T::ValueType > &pointer, typename T::ValueType &value, typename T::AllocatorType &a)
Definition: pointer.h:1848
const CharType(& source)[N]
Definition: pointer.h:1559
T::ValueType & CreateValueByPointer(T &root, const GenericPointer< typename T::ValueType > &pointer, typename T::AllocatorType &a)
Definition: pointer.h:1412
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1517
Type
Type of JSON value.
Definition: rapidjson.h:760
@ kObjectType
object
Definition: rapidjson.h:764
@ kArrayType
array
Definition: rapidjson.h:765
#define RAPIDJSON_DELETE(x)
! customization point for global delete
Definition: rapidjson.h:746
RAPIDJSON_NAMESPACE_BEGIN typedef unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:429
#define RAPIDJSON_NEW(TypeName)
! customization point for global new
Definition: rapidjson.h:742
A read-write string stream.
Definition: stream.h:210
A token is the basic units of internal representation.
Definition: pointer.h:96
SizeType index
A valid array index, if it is not equal to kPointerInvalidIndex.
Definition: pointer.h:100
SizeType length
Length of the name.
Definition: pointer.h:99
const Ch * name
Definition: pointer.h:97
Reference to a constant string (not taking a copy)
Definition: document.h:417
Read-only string stream.
Definition: stream.h:163
Encoding conversion.
Definition: encodings.h:823
UTF-8 encoding.
Definition: encodings.h:98
Definition: document.h:595