@@ -302,11 +302,6 @@ private static void generateGroupClassHeader(
302302 indent  + " *m_positionPtr = sbeCheckPosition(position);\n "  +
303303 indent  + " }\n \n "  +
304304
305-  indent  + " SBE_NODISCARD std::string sbeEscapeJson(const std::string &s) const SBE_NOEXCEPT\n "  +
306-  indent  + " {\n "  +
307-  indent  + " return ::sbeEscapeJsonString(s);\n "  +
308-  indent  + " }\n \n "  +
309- 
310305 indent  + " SBE_NODISCARD inline std::uint64_t count() const SBE_NOEXCEPT\n "  +
311306 indent  + " {\n "  +
312307 indent  + " return m_count;\n "  +
@@ -526,6 +521,29 @@ private CharSequence generateVarData(final String className, final List<Token> t
526521 lengthByteOrderStr ,
527522 lengthCppType ));
528523
524+  sb .append (String .format ("\n "  +
525+  indent  + " std::string get%1$sAsJsonEscapedString()\n "  +
526+  indent  + " {\n "  +
527+  "%2$s"  +
528+  indent  + " std::ostringstream oss;\n "  +
529+  indent  + " std::string s = get%1$sAsString();\n \n "  +
530+  indent  + " for (auto c = s.cbegin(); c != s.cend(); c++)\n "  +
531+  indent  + " {\n "  +
532+  indent  + " if (*c == '\" ' || *c == '\\ \\ ' || ('\\ x00' <= *c && *c <= '\\ x1f'))\n "  +
533+  indent  + " {\n "  +
534+  indent  + " oss << \" \\ \\ u\" "  + " << std::hex << std::setw(4)\n "  +
535+  indent  + " << std::setfill('0') << (int)(*c);\n "  +
536+  indent  + " }\n "  +
537+  indent  + " else\n "  +
538+  indent  + " {\n "  +
539+  indent  + " oss << *c;\n "  +
540+  indent  + " }\n "  +
541+  indent  + " }\n \n "  +
542+  indent  + " return oss.str();\n "  +
543+  indent  + " }\n " ,
544+  propertyName ,
545+  generateStringNotPresentCondition (token .version (), indent )));
546+ 
529547 sb .append (String .format ("\n "  +
530548 indent  + " #if __cplusplus >= 201703L\n "  +
531549 indent  + " std::string_view get%1$sAsStringView()\n "  +
@@ -1064,8 +1082,6 @@ private static CharSequence generateFileHeader(
10641082 String .join ("_" , namespaces ).toUpperCase (),
10651083 className .toUpperCase ()));
10661084
1067-  sb .append (generateEscapeFunction ());
1068- 
10691085 if  (typesToInclude  != null  && typesToInclude .size () != 0 )
10701086 {
10711087 sb .append ("\n " );
@@ -1082,35 +1098,11 @@ private static CharSequence generateFileHeader(
10821098 return  sb ;
10831099 }
10841100
1085-  private  static  CharSequence  generateEscapeFunction ()
1086-  {
1087-  return 
1088-  "#ifndef _SBE_JSON_ESCAPE_FUNC_H_\n "  +
1089-  "#define _SBE_JSON_ESCAPE_FUNC_H_\n "  +
1090-  "static inline std::string sbeEscapeJsonString(const std::string &s)\n "  +
1091-  "{\n "  +
1092-  " std::ostringstream oss;\n \n "  +
1093-  " for (auto c = s.cbegin(); c != s.cend(); c++)\n "  +
1094-  " {\n "  +
1095-  " if (*c == '\" ' || *c == '\\ \\ ' || ('\\ x00' <= *c && *c <= '\\ x1f'))\n "  +
1096-  " {\n "  +
1097-  " oss << \" \\ \\ u\" "  + " << std::hex << std::setw(4) << std::setfill('0') << (int)*c;\n "  +
1098-  " }\n "  +
1099-  " else\n "  +
1100-  " {\n "  +
1101-  " oss << *c;\n "  +
1102-  " }\n "  +
1103-  " }\n \n "  +
1104-  " return oss.str();\n "  +
1105-  "}\n "  +
1106-  "#endif\n \n " ;
1107-  }
1108- 
11091101 private  static  CharSequence  generateClassDeclaration (final  String  className )
11101102 {
11111103 return 
1112-    "class "  + className  + "\n "  +
1113-    "{\n " ;
1104+  "class "  + className  + "\n "  +
1105+  "{\n " ;
11141106 }
11151107
11161108 private  static  CharSequence  generateEnumDeclaration (final  String  name )
@@ -1724,8 +1716,11 @@ private CharSequence generateFixedFlyweightCode(final String className, final in
17241716 " {\n "  +
17251717 " }\n \n "  +
17261718
1727-  " %1$s &wrap(char *buffer, const std::uint64_t offset, const std::uint64_t actingVersion,"  +
1728-  " const std::uint64_t bufferLength)\n "  +
1719+  " %1$s &wrap(\n "  +
1720+  " char *buffer,\n "  +
1721+  " const std::uint64_t offset,\n "  +
1722+  " const std::uint64_t actingVersion,\n "  +
1723+  " const std::uint64_t bufferLength)\n "  +
17291724 " {\n "  +
17301725 " return *this = %1$s(buffer, offset, bufferLength, actingVersion);\n "  +
17311726 " }\n \n "  +
@@ -1935,11 +1930,6 @@ private CharSequence generateMessageFlyweightCode(final String className, final
19351930 " m_position = sbeCheckPosition(position);\n "  +
19361931 " }\n \n "  +
19371932
1938-  " SBE_NODISCARD std::string sbeEscapeJson(const std::string &s) const SBE_NOEXCEPT\n "  +
1939-  " {\n "  +
1940-  " return ::sbeEscapeJsonString(s);\n "  +
1941-  " }\n \n "  +
1942- 
19431933 " SBE_NODISCARD std::uint64_t encodedLength() const SBE_NOEXCEPT\n "  +
19441934 " {\n "  +
19451935 " return sbePosition() - m_offset;\n "  +
@@ -2494,17 +2484,20 @@ private CharSequence appendDisplay(
24942484
24952485 if  (null  == characterEncoding )
24962486 {
2497-  final  String  getAsStringFunction  = 
2498-     "writer.get "  + toUpperFirstChar ( varDataToken . name ())  + "AsString().c_str ()" ;
2487+  final  String  propertyName  =  toLowerFirstChar ( varDataToken . name ()); 
2488+  final   String   getLengthFunction  =  "writer."  + propertyName  + "Length ()" ;
24992489
25002490 sb .append (
25012491 indent  + "builder << '\" ' <<\n "  +
2502-  indent  + INDENT  + getAsStringFunction  + " << '\" ';\n \n " );
2492+  indent  + INDENT  + getLengthFunction  + " << \"  bytes of raw data\\ \" \" ;\n " );
2493+ 
2494+  sb .append (
2495+  indent  + "writer."  + propertyName  + "();\n \n " );
25032496 }
25042497 else 
25052498 {
25062499 final  String  getAsStringFunction  =
2507-  "writer.sbeEscapeJson(writer. get"  + toUpperFirstChar (varDataToken .name ()) + "AsString() ).c_str()" ;
2500+  "writer.get"  + toUpperFirstChar (varDataToken .name ()) + "AsJsonEscapedString( ).c_str()" ;
25082501
25092502 sb .append (
25102503 indent  + "builder << '\" ' <<\n "  +
0 commit comments