Skip to content

Commit c24ac39

Browse files
committed
[C++] Provide a get<property name>AsJsonEscapedString for var data and use it pretty printing plus give a summary of raw binary data rather than trying to print. Issue aeron-io#718.
1 parent 3a6e134 commit c24ac39

File tree

1 file changed

+37
-44
lines changed

1 file changed

+37
-44
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)