Skip to content

Commit 9ed9b77

Browse files
authored
Merge pull request aeron-io#351 from vdidenko/cpp_nested_namespaces
C++ nested namespaces
2 parents bdb0a0a + a4a3484 commit 9ed9b77

File tree

14 files changed

+61
-26
lines changed

14 files changed

+61
-26
lines changed

sbe-benchmarks/src/main/cpp/SbeCarCodecBench.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include "CodecBench.h"
2020
#include "uk_co_real_logic_sbe_benchmarks/Car.h"
2121

22-
using namespace uk_co_real_logic_sbe_benchmarks;
22+
using namespace uk::co::real_logic::sbe::benchmarks;
2323

2424
char VEHICLE_CODE[] = {'a', 'b', 'c', 'd', 'e', 'f'};
2525
uint32_t SOMENUMBERS[] = { 1, 2, 3, 4, 5 };

sbe-benchmarks/src/main/cpp/SbeMarketDataCodecBench.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "uk_co_real_logic_sbe_benchmarks_fix/MessageHeader.h"
2121
#include "uk_co_real_logic_sbe_benchmarks_fix/MarketDataIncrementalRefreshTrades.h"
2222

23-
using namespace uk_co_real_logic_sbe_benchmarks_fix;
23+
using namespace uk::co::real_logic::sbe::benchmarks::fix;
2424

2525
class SbeMarketDataCodecBench : public CodecBench<SbeMarketDataCodecBench>
2626
{

sbe-tool/src/main/java/uk/co/real_logic/sbe/SbeTool.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ public class SbeTool
121121
*/
122122
public static final String JAVA_GENERATE_INTERFACES = "sbe.java.generate.interfaces";
123123

124+
/**
125+
* Boolean system property to turn on or off collapsing of nested namespaces in generated C++ stubs. Defaults to false.
126+
*/
127+
public static final String CPP_NAMESPACES_COLLAPSE = "sbe.cpp.namespaces.collapse";
128+
124129
/**
125130
* Package in which the generated Java interfaces will be placed.
126131
*/

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ public void generateMessageHeaderStub() throws IOException
5656
try (final Writer out = outputManager.createOutput(messageHeader))
5757
{
5858
final List<Token> tokens = ir.headerStructure().tokens();
59-
out.append(generateFileHeader(ir.applicableNamespace().replace('.', '_'), messageHeader, null));
59+
out.append(generateFileHeader(ir.namespaces(), messageHeader, null));
6060
out.append(generateClassDeclaration(messageHeader));
6161
out.append(generateFixedFlyweightCode(messageHeader, tokens.get(0).encodedLength()));
6262
out.append(generateCompositePropertyElements(
6363
messageHeader, tokens.subList(1, tokens.size() - 1), BASE_INDENT));
6464

65-
out.append("};\n}\n#endif\n");
65+
out.append(CppUtil.closingBraces(ir.namespaces().length) + "}\n#endif\n");
6666
}
6767
}
6868

@@ -124,7 +124,7 @@ public void generate() throws IOException
124124

125125
try (final Writer out = outputManager.createOutput(className))
126126
{
127-
out.append(generateFileHeader(ir.applicableNamespace().replace('.', '_'), className, typesToInclude));
127+
out.append(generateFileHeader(ir.namespaces(), className, typesToInclude));
128128
out.append(generateClassDeclaration(className));
129129
out.append(generateMessageFlyweightCode(className, msgToken));
130130

@@ -146,7 +146,7 @@ public void generate() throws IOException
146146
out.append(sb);
147147
out.append(generateVarData(className, varData, BASE_INDENT));
148148

149-
out.append("};\n}\n#endif\n");
149+
out.append(CppUtil.closingBraces(ir.namespaces().length) + "}\n#endif\n");
150150
}
151151
}
152152
}
@@ -566,7 +566,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
566566

567567
try (final Writer out = outputManager.createOutput(bitSetName))
568568
{
569-
out.append(generateFileHeader(ir.applicableNamespace().replace('.', '_'), bitSetName, null));
569+
out.append(generateFileHeader(ir.namespaces(), bitSetName, null));
570570
out.append(generateClassDeclaration(bitSetName));
571571
out.append(generateFixedFlyweightCode(bitSetName, tokens.get(0).encodedLength()));
572572

@@ -583,7 +583,7 @@ private void generateChoiceSet(final List<Token> tokens) throws IOException
583583

584584
out.append(generateChoices(bitSetName, tokens.subList(1, tokens.size() - 1)));
585585

586-
out.append("};\n}\n#endif\n");
586+
out.append(CppUtil.closingBraces(ir.namespaces().length) + "}\n#endif\n");
587587
}
588588
}
589589

@@ -594,14 +594,14 @@ private void generateEnum(final List<Token> tokens) throws IOException
594594

595595
try (final Writer out = outputManager.createOutput(enumName))
596596
{
597-
out.append(generateFileHeader(ir.applicableNamespace().replace('.', '_'), enumName, null));
597+
out.append(generateFileHeader(ir.namespaces(), enumName, null));
598598
out.append(generateEnumDeclaration(enumName));
599599

600600
out.append(generateEnumValues(tokens.subList(1, tokens.size() - 1), enumToken));
601601

602602
out.append(generateEnumLookupMethod(tokens.subList(1, tokens.size() - 1), enumToken));
603603

604-
out.append("};\n}\n#endif\n");
604+
out.append(CppUtil.closingBraces(ir.namespaces().length) + "}\n#endif\n");
605605
}
606606
}
607607

@@ -611,14 +611,14 @@ private void generateComposite(final List<Token> tokens) throws IOException
611611

612612
try (final Writer out = outputManager.createOutput(compositeName))
613613
{
614-
out.append(generateFileHeader(ir.applicableNamespace().replace('.', '_'), compositeName,
614+
out.append(generateFileHeader(ir.namespaces(), compositeName,
615615
generateTypesToIncludes(tokens.subList(1, tokens.size() - 1))));
616616
out.append(generateClassDeclaration(compositeName));
617617
out.append(generateFixedFlyweightCode(compositeName, tokens.get(0).encodedLength()));
618618

619619
out.append(generateCompositePropertyElements(compositeName, tokens.subList(1, tokens.size() - 1), BASE_INDENT));
620620

621-
out.append("};\n}\n#endif\n");
621+
out.append(CppUtil.closingBraces(ir.namespaces().length) + "}\n#endif\n");
622622
}
623623
}
624624

@@ -815,7 +815,7 @@ private static CharSequence generateTypeFieldNotPresentCondition(final int since
815815
}
816816

817817
private static CharSequence generateFileHeader(
818-
final String namespaceName,
818+
final String[] namespaces,
819819
final String className,
820820
final List<String> typesToInclude)
821821
{
@@ -844,7 +844,7 @@ private static CharSequence generateFileHeader(
844844
"# include <cstring>\n" +
845845
"#endif\n\n" +
846846
"#include <sbe/sbe.h>\n\n",
847-
namespaceName.toUpperCase(),
847+
String.join("_", namespaces).toUpperCase(),
848848
className.toUpperCase()
849849
));
850850

@@ -860,11 +860,12 @@ private static CharSequence generateFileHeader(
860860
sb.append("\n");
861861
}
862862

863-
sb.append(String.format(
863+
sb.append(
864864
"using namespace sbe;\n\n" +
865-
"namespace %1$s {\n\n",
866-
namespaceName
867-
));
865+
"namespace " +
866+
String.join(" {\nnamespace ", namespaces) +
867+
" {\n\n"
868+
);
868869

869870
return sb;
870871
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,9 @@ public static String formatByteOrderEncoding(final ByteOrder byteOrder, final Pr
139139
return "";
140140
}
141141
}
142+
143+
public static String closingBraces(final int count)
144+
{
145+
return new String(new char[count]).replace("\0", "};\n");
146+
}
142147
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/Ir.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717

1818
import org.agrona.Verify;
1919

20+
import uk.co.real_logic.sbe.SbeTool;
21+
2022
import java.util.*;
23+
import java.util.regex.Pattern;
2124

2225
/**
2326
* Intermediate representation of SBE messages to be used for the generation of encoders and decoders
@@ -35,6 +38,8 @@ public class Ir
3538
private final Map<Long, List<Token>> messagesByIdMap = new HashMap<>();
3639
private final Map<String, List<Token>> typesByNameMap = new HashMap<>();
3740

41+
private final String[] namespaces;
42+
3843
/**
3944
* Create a new IR container taking a defensive copy of the headerStructure {@link Token}s passed.
4045
*
@@ -62,6 +67,15 @@ public Ir(
6267
this.version = version;
6368
this.semanticVersion = semanticVersion;
6469
this.headerStructure = new HeaderStructure(new ArrayList<>(headerTokens));
70+
71+
if (Boolean.getBoolean(SbeTool.CPP_NAMESPACES_COLLAPSE))
72+
{
73+
this.namespaces = new String[]{ (namespaceName == null ? packageName : namespaceName).replace(".", "_") };
74+
}
75+
else
76+
{
77+
this.namespaces = Pattern.compile("\\.").split(namespaceName == null ? packageName : namespaceName);
78+
}
6579
}
6680

6781
/**
@@ -153,6 +167,16 @@ public String namespaceName()
153167
return namespaceName;
154168
}
155169

170+
/**
171+
* Get the namespaces array to be used for generated code.
172+
*
173+
* @return the namespaces array to be used for generated code.
174+
*/
175+
public String[] namespaces()
176+
{
177+
return namespaces;
178+
}
179+
156180
/**
157181
* Get the id number of the schema.
158182
*

sbe-tool/src/test/cpp/BoundsCheckTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include "code_generation_test/Car.h"
2323

2424
using namespace std;
25-
using namespace code_generation_test;
25+
using namespace code::generation::test;
2626

2727
#define SERIAL_NUMBER 1234u
2828
#define MODEL_YEAR 2013

sbe-tool/src/test/cpp/CodeGenTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "code_generation_test/Car.h"
2121

2222
using namespace std;
23-
using namespace code_generation_test;
23+
using namespace code::generation::test;
2424

2525
static const std::size_t BUFFER_LEN = 2048;
2626

sbe-tool/src/test/cpp/CompositeElementsTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "otf/OtfMessageDecoder.h"
2424

2525
using namespace std;
26-
using namespace composite_elements;
26+
using namespace composite::elements;
2727
using namespace sbe::otf;
2828

2929
enum EventNumber

sbe-tool/src/test/cpp/CompositeOffsetsCodeGenTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "composite_offsets_test/TestMessage1.h"
2121

2222
using namespace std;
23-
using namespace composite_offsets_test;
23+
using namespace composite::offsets::test;
2424

2525
class CompositeOffsetsCodeGenTest : public testing::Test
2626
{

0 commit comments

Comments
 (0)