15 #ifndef RAPIDJSON_ENCODINGS_H_    16 #define RAPIDJSON_ENCODINGS_H_    18 #include "rapidjson.h"    20 #if defined(_MSC_VER) && !defined(__clang__)    22 RAPIDJSON_DIAG_OFF(4244) 
    23 RAPIDJSON_DIAG_OFF(4702)  
    24 #elif defined(__GNUC__)    26 RAPIDJSON_DIAG_OFF(effc++)
    27 RAPIDJSON_DIAG_OFF(overflow)
    95 template<
typename CharType = 
char>
    99     enum { supportUnicode = 1 };
   101     template<
typename OutputStream>
   102     static void Encode(OutputStream& os, 
unsigned codepoint) {
   103         if (codepoint <= 0x7F) 
   104             os.Put(static_cast<Ch>(codepoint & 0xFF));
   105         else if (codepoint <= 0x7FF) {
   106             os.Put(static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));
   107             os.Put(static_cast<Ch>(0x80 | ((codepoint & 0x3F))));
   109         else if (codepoint <= 0xFFFF) {
   110             os.Put(static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));
   111             os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
   112             os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
   116             os.Put(static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));
   117             os.Put(static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));
   118             os.Put(static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
   119             os.Put(static_cast<Ch>(0x80 | (codepoint & 0x3F)));
   123     template<
typename OutputStream>
   124     static void EncodeUnsafe(OutputStream& os, 
unsigned codepoint) {
   125         if (codepoint <= 0x7F) 
   126             PutUnsafe(os, static_cast<Ch>(codepoint & 0xFF));
   127         else if (codepoint <= 0x7FF) {
   128             PutUnsafe(os, static_cast<Ch>(0xC0 | ((codepoint >> 6) & 0xFF)));
   129             PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint & 0x3F))));
   131         else if (codepoint <= 0xFFFF) {
   132             PutUnsafe(os, static_cast<Ch>(0xE0 | ((codepoint >> 12) & 0xFF)));
   133             PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
   134             PutUnsafe(os, static_cast<Ch>(0x80 | (codepoint & 0x3F)));
   138             PutUnsafe(os, static_cast<Ch>(0xF0 | ((codepoint >> 18) & 0xFF)));
   139             PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 12) & 0x3F)));
   140             PutUnsafe(os, static_cast<Ch>(0x80 | ((codepoint >> 6) & 0x3F)));
   141             PutUnsafe(os, static_cast<Ch>(0x80 | (codepoint & 0x3F)));
   145     template <
typename InputStream>
   146     static bool Decode(InputStream& is, 
unsigned* codepoint) {
   147 #define RAPIDJSON_COPY() c = is.Take(); *codepoint = (*codepoint << 6) | (static_cast<unsigned char>(c) & 0x3Fu)   148 #define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast<unsigned char>(c)) & mask) != 0)   149 #define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70)   150         typename InputStream::Ch c = is.Take();
   152             *codepoint = 
static_cast<unsigned char>(c);
   156         unsigned char type = GetRange(static_cast<unsigned char>(c));
   160             *codepoint = (0xFFu >> type) & static_cast<unsigned char>(c);
   164         case 2: RAPIDJSON_TAIL(); 
return result;
   165         case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   166         case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); 
return result;
   167         case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   168         case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   169         case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); 
return result;
   170         case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   171         default: 
return false;
   173 #undef RAPIDJSON_COPY   174 #undef RAPIDJSON_TRANS   175 #undef RAPIDJSON_TAIL   178     template <
typename InputStream, 
typename OutputStream>
   179     static bool Validate(InputStream& is, OutputStream& os) {
   180 #define RAPIDJSON_COPY() os.Put(c = is.Take())   181 #define RAPIDJSON_TRANS(mask) result &= ((GetRange(static_cast<unsigned char>(c)) & mask) != 0)   182 #define RAPIDJSON_TAIL() RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x70)   189         switch (GetRange(static_cast<unsigned char>(c))) {
   190         case 2: RAPIDJSON_TAIL(); 
return result;
   191         case 3: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   192         case 4: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x50); RAPIDJSON_TAIL(); 
return result;
   193         case 5: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x10); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   194         case 6: RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   195         case 10: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x20); RAPIDJSON_TAIL(); 
return result;
   196         case 11: RAPIDJSON_COPY(); RAPIDJSON_TRANS(0x60); RAPIDJSON_TAIL(); RAPIDJSON_TAIL(); 
return result;
   197         default: 
return false;
   199 #undef RAPIDJSON_COPY   200 #undef RAPIDJSON_TRANS   201 #undef RAPIDJSON_TAIL   204     static unsigned char GetRange(
unsigned char c) {
   207         static const unsigned char type[] = {
   208             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   209             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   210             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   211             0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   212             0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
   213             0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
   214             0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
   215             0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
   216             8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
   217             10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
   222     template <
typename InputByteStream>
   223     static CharType TakeBOM(InputByteStream& is) {
   224         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   225         typename InputByteStream::Ch c = Take(is);
   226         if (static_cast<unsigned char>(c) != 0xEFu) 
return c;
   228         if (static_cast<unsigned char>(c) != 0xBBu) 
return c;
   230         if (static_cast<unsigned char>(c) != 0xBFu) 
return c;
   235     template <
typename InputByteStream>
   236     static Ch Take(InputByteStream& is) {
   237         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   238         return static_cast<Ch
>(is.Take());
   241     template <
typename OutputByteStream>
   242     static void PutBOM(OutputByteStream& os) {
   243         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   244         os.Put(static_cast<typename OutputByteStream::Ch>(0xEFu));
   245         os.Put(static_cast<typename OutputByteStream::Ch>(0xBBu));
   246         os.Put(static_cast<typename OutputByteStream::Ch>(0xBFu));
   249     template <
typename OutputByteStream>
   250     static void Put(OutputByteStream& os, Ch c) {
   251         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   252         os.Put(static_cast<typename OutputByteStream::Ch>(c));
   268 template<
typename CharType = 
wchar_t>
   271     RAPIDJSON_STATIC_ASSERT(
sizeof(Ch) >= 2);
   273     enum { supportUnicode = 1 };
   275     template<
typename OutputStream>
   276     static void Encode(OutputStream& os, 
unsigned codepoint) {
   277         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputStream::Ch) >= 2);
   278         if (codepoint <= 0xFFFF) {
   280             os.Put(static_cast<typename OutputStream::Ch>(codepoint));
   284             unsigned v = codepoint - 0x10000;
   285             os.Put(static_cast<typename OutputStream::Ch>((v >> 10) | 0xD800));
   286             os.Put(static_cast<typename OutputStream::Ch>((v & 0x3FF) | 0xDC00));
   291     template<
typename OutputStream>
   292     static void EncodeUnsafe(OutputStream& os, 
unsigned codepoint) {
   293         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputStream::Ch) >= 2);
   294         if (codepoint <= 0xFFFF) {
   296             PutUnsafe(os, static_cast<typename OutputStream::Ch>(codepoint));
   300             unsigned v = codepoint - 0x10000;
   301             PutUnsafe(os, static_cast<typename OutputStream::Ch>((v >> 10) | 0xD800));
   302             PutUnsafe(os, static_cast<typename OutputStream::Ch>((v & 0x3FF) | 0xDC00));
   306     template <
typename InputStream>
   307     static bool Decode(InputStream& is, 
unsigned* codepoint) {
   308         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputStream::Ch) >= 2);
   309         typename InputStream::Ch c = is.Take();
   310         if (c < 0xD800 || c > 0xDFFF) {
   311             *codepoint = 
static_cast<unsigned>(c);
   314         else if (c <= 0xDBFF) {
   315             *codepoint = (
static_cast<unsigned>(c) & 0x3FF) << 10;
   317             *codepoint |= (
static_cast<unsigned>(c) & 0x3FF);
   318             *codepoint += 0x10000;
   319             return c >= 0xDC00 && c <= 0xDFFF;
   324     template <
typename InputStream, 
typename OutputStream>
   325     static bool Validate(InputStream& is, OutputStream& os) {
   326         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputStream::Ch) >= 2);
   327         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputStream::Ch) >= 2);
   328         typename InputStream::Ch c;
   329         os.Put(static_cast<typename OutputStream::Ch>(c = is.Take()));
   330         if (c < 0xD800 || c > 0xDFFF)
   332         else if (c <= 0xDBFF) {
   333             os.Put(c = is.Take());
   334             return c >= 0xDC00 && c <= 0xDFFF;
   341 template<
typename CharType = 
wchar_t>
   343     template <
typename InputByteStream>
   344     static CharType TakeBOM(InputByteStream& is) {
   345         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   346         CharType c = Take(is);
   347         return static_cast<uint16_t
>(c) == 0xFEFFu ? Take(is) : c;
   350     template <
typename InputByteStream>
   351     static CharType Take(InputByteStream& is) {
   352         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   353         unsigned c = 
static_cast<uint8_t
>(is.Take());
   354         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 8;
   355         return static_cast<CharType
>(c);
   358     template <
typename OutputByteStream>
   359     static void PutBOM(OutputByteStream& os) {
   360         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   361         os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));
   362         os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));
   365     template <
typename OutputByteStream>
   366     static void Put(OutputByteStream& os, CharType c) {
   367         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   368         os.Put(static_cast<typename OutputByteStream::Ch>(static_cast<unsigned>(c) & 0xFFu));
   369         os.Put(static_cast<typename OutputByteStream::Ch>((static_cast<unsigned>(c) >> 8) & 0xFFu));
   374 template<
typename CharType = 
wchar_t>
   376     template <
typename InputByteStream>
   377     static CharType TakeBOM(InputByteStream& is) {
   378         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   379         CharType c = Take(is);
   380         return static_cast<uint16_t
>(c) == 0xFEFFu ? Take(is) : c;
   383     template <
typename InputByteStream>
   384     static CharType Take(InputByteStream& is) {
   385         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   386         unsigned c = 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 8;
   387         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take()));
   388         return static_cast<CharType
>(c);
   391     template <
typename OutputByteStream>
   392     static void PutBOM(OutputByteStream& os) {
   393         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   394         os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));
   395         os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));
   398     template <
typename OutputByteStream>
   399     static void Put(OutputByteStream& os, CharType c) {
   400         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   401         os.Put(static_cast<typename OutputByteStream::Ch>((static_cast<unsigned>(c) >> 8) & 0xFFu));
   402         os.Put(static_cast<typename OutputByteStream::Ch>(static_cast<unsigned>(c) & 0xFFu));
   417 template<
typename CharType = 
unsigned>
   420     RAPIDJSON_STATIC_ASSERT(
sizeof(Ch) >= 4);
   422     enum { supportUnicode = 1 };
   424     template<
typename OutputStream>
   425     static void Encode(OutputStream& os, 
unsigned codepoint) {
   426         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputStream::Ch) >= 4);
   431     template<
typename OutputStream>
   432     static void EncodeUnsafe(OutputStream& os, 
unsigned codepoint) {
   433         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputStream::Ch) >= 4);
   435         PutUnsafe(os, codepoint);
   438     template <
typename InputStream>
   439     static bool Decode(InputStream& is, 
unsigned* codepoint) {
   440         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputStream::Ch) >= 4);
   443         return c <= 0x10FFFF;
   446     template <
typename InputStream, 
typename OutputStream>
   447     static bool Validate(InputStream& is, OutputStream& os) {
   448         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputStream::Ch) >= 4);
   450         os.Put(c = is.Take());
   451         return c <= 0x10FFFF;
   456 template<
typename CharType = 
unsigned>
   458     template <
typename InputByteStream>
   459     static CharType TakeBOM(InputByteStream& is) {
   460         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   461         CharType c = Take(is);
   462         return static_cast<uint32_t
>(c) == 0x0000FEFFu ? Take(is) : c;
   465     template <
typename InputByteStream>
   466     static CharType Take(InputByteStream& is) {
   467         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   468         unsigned c = 
static_cast<uint8_t
>(is.Take());
   469         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 8;
   470         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 16;
   471         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 24;
   472         return static_cast<CharType
>(c);
   475     template <
typename OutputByteStream>
   476     static void PutBOM(OutputByteStream& os) {
   477         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   478         os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));
   479         os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));
   480         os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));
   481         os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));
   484     template <
typename OutputByteStream>
   485     static void Put(OutputByteStream& os, CharType c) {
   486         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   487         os.Put(static_cast<typename OutputByteStream::Ch>(c & 0xFFu));
   488         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 8) & 0xFFu));
   489         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 16) & 0xFFu));
   490         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 24) & 0xFFu));
   495 template<
typename CharType = 
unsigned>
   497     template <
typename InputByteStream>
   498     static CharType TakeBOM(InputByteStream& is) {
   499         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   500         CharType c = Take(is);
   501         return static_cast<uint32_t
>(c) == 0x0000FEFFu ? Take(is) : c; 
   504     template <
typename InputByteStream>
   505     static CharType Take(InputByteStream& is) {
   506         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   507         unsigned c = 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 24;
   508         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 16;
   509         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take())) << 8;
   510         c |= 
static_cast<unsigned>(
static_cast<uint8_t
>(is.Take()));
   511         return static_cast<CharType
>(c);
   514     template <
typename OutputByteStream>
   515     static void PutBOM(OutputByteStream& os) {
   516         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   517         os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));
   518         os.Put(static_cast<typename OutputByteStream::Ch>(0x00u));
   519         os.Put(static_cast<typename OutputByteStream::Ch>(0xFEu));
   520         os.Put(static_cast<typename OutputByteStream::Ch>(0xFFu));
   523     template <
typename OutputByteStream>
   524     static void Put(OutputByteStream& os, CharType c) {
   525         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   526         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 24) & 0xFFu));
   527         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 16) & 0xFFu));
   528         os.Put(static_cast<typename OutputByteStream::Ch>((c >> 8) & 0xFFu));
   529         os.Put(static_cast<typename OutputByteStream::Ch>(c & 0xFFu));
   541 template<
typename CharType = 
char>
   545     enum { supportUnicode = 0 };
   547     template<
typename OutputStream>
   548     static void Encode(OutputStream& os, 
unsigned codepoint) {
   550         os.Put(static_cast<Ch>(codepoint & 0xFF));
   553     template<
typename OutputStream>
   554     static void EncodeUnsafe(OutputStream& os, 
unsigned codepoint) {
   556         PutUnsafe(os, static_cast<Ch>(codepoint & 0xFF));
   559     template <
typename InputStream>
   560     static bool Decode(InputStream& is, 
unsigned* codepoint) {
   561         uint8_t c = 
static_cast<uint8_t
>(is.Take());
   566     template <
typename InputStream, 
typename OutputStream>
   567     static bool Validate(InputStream& is, OutputStream& os) {
   568         uint8_t c = 
static_cast<uint8_t
>(is.Take());
   569         os.Put(static_cast<typename OutputStream::Ch>(c));
   573     template <
typename InputByteStream>
   574     static CharType TakeBOM(InputByteStream& is) {
   575         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   576         uint8_t c = 
static_cast<uint8_t
>(Take(is));
   577         return static_cast<Ch
>(c);
   580     template <
typename InputByteStream>
   581     static Ch Take(InputByteStream& is) {
   582         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename InputByteStream::Ch) == 1);
   583         return static_cast<Ch
>(is.Take());
   586     template <
typename OutputByteStream>
   587     static void PutBOM(OutputByteStream& os) {
   588         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   592     template <
typename OutputByteStream>
   593     static void Put(OutputByteStream& os, Ch c) {
   594         RAPIDJSON_STATIC_ASSERT(
sizeof(
typename OutputByteStream::Ch) == 1);
   595         os.Put(static_cast<typename OutputByteStream::Ch>(c));
   614 template<
typename CharType>
   618     enum { supportUnicode = 1 };
   620 #define RAPIDJSON_ENCODINGS_FUNC(x) UTF8<Ch>::x, UTF16LE<Ch>::x, UTF16BE<Ch>::x, UTF32LE<Ch>::x, UTF32BE<Ch>::x   622     template<
typename OutputStream>
   623     static RAPIDJSON_FORCEINLINE 
void Encode(OutputStream& os, 
unsigned codepoint) {
   624         typedef void (*EncodeFunc)(OutputStream&, unsigned);
   625         static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Encode) };
   626         (*f[os.GetType()])(os, codepoint);
   629     template<
typename OutputStream>
   630     static RAPIDJSON_FORCEINLINE 
void EncodeUnsafe(OutputStream& os, 
unsigned codepoint) {
   631         typedef void (*EncodeFunc)(OutputStream&, unsigned);
   632         static const EncodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(EncodeUnsafe) };
   633         (*f[os.GetType()])(os, codepoint);
   636     template <
typename InputStream>
   637     static RAPIDJSON_FORCEINLINE 
bool Decode(InputStream& is, 
unsigned* codepoint) {
   638         typedef bool (*DecodeFunc)(InputStream&, 
unsigned*);
   639         static const DecodeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Decode) };
   640         return (*f[is.GetType()])(is, codepoint);
   643     template <
typename InputStream, 
typename OutputStream>
   644     static RAPIDJSON_FORCEINLINE 
bool Validate(InputStream& is, OutputStream& os) {
   645         typedef bool (*ValidateFunc)(InputStream&, OutputStream&);
   646         static const ValidateFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Validate) };
   647         return (*f[is.GetType()])(is, os);
   650 #undef RAPIDJSON_ENCODINGS_FUNC   657 template<
typename SourceEncoding, 
typename TargetEncoding>
   660     template<
typename InputStream, 
typename OutputStream>
   661     static RAPIDJSON_FORCEINLINE 
bool Transcode(InputStream& is, OutputStream& os) {
   663         if (!SourceEncoding::Decode(is, &codepoint))
   665         TargetEncoding::Encode(os, codepoint);
   669     template<
typename InputStream, 
typename OutputStream>
   670     static RAPIDJSON_FORCEINLINE 
bool TranscodeUnsafe(InputStream& is, OutputStream& os) {
   672         if (!SourceEncoding::Decode(is, &codepoint))
   674         TargetEncoding::EncodeUnsafe(os, codepoint);
   679     template<
typename InputStream, 
typename OutputStream>
   680     static RAPIDJSON_FORCEINLINE 
bool Validate(InputStream& is, OutputStream& os) {
   681         return Transcode(is, os);   
   686 template<
typename Stream>
   687 inline void PutUnsafe(Stream& stream, 
typename Stream::Ch c);
   690 template<
typename Encoding>
   692     template<
typename InputStream, 
typename OutputStream>
   693     static RAPIDJSON_FORCEINLINE 
bool Transcode(InputStream& is, OutputStream& os) {
   698     template<
typename InputStream, 
typename OutputStream>
   699     static RAPIDJSON_FORCEINLINE 
bool TranscodeUnsafe(InputStream& is, OutputStream& os) {
   700         PutUnsafe(os, is.Take());  
   704     template<
typename InputStream, 
typename OutputStream>
   705     static RAPIDJSON_FORCEINLINE 
bool Validate(InputStream& is, OutputStream& os) {
   706         return Encoding::Validate(is, os);  
   712 #if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__))   716 #endif // RAPIDJSON_ENCODINGS_H_ #define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression) 
Definition: rapidjson.h:121
Encoding conversion. 
Definition: encodings.h:658
Dynamically select encoding according to stream's runtime-specified UTF encoding type. 
Definition: encodings.h:615
ASCII encoding. 
Definition: encodings.h:542
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression) 
Definition: rapidjson.h:124
UTF-32 big endian encoding. 
Definition: encodings.h:496
UTF-32 little endian enocoding. 
Definition: encodings.h:457
UTF-32 encoding. 
Definition: encodings.h:418
UTF-16 encoding. 
Definition: encodings.h:269
static RAPIDJSON_FORCEINLINE bool Transcode(InputStream &is, OutputStream &os)
Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the outp...
Definition: encodings.h:661
UTF-16 big endian encoding. 
Definition: encodings.h:375
UTF-16 little endian encoding. 
Definition: encodings.h:342
#define RAPIDJSON_ASSERT(x)
Assertion. 
Definition: rapidjson.h:437
UTF-8 encoding. 
Definition: encodings.h:96
static RAPIDJSON_FORCEINLINE bool Validate(InputStream &is, OutputStream &os)
Validate one Unicode codepoint from an encoded stream. 
Definition: encodings.h:680