Skip to content

Commit 67df80c

Browse files
committed
[c++] Improve IR and OTF code by reducing warnings and avoiding unnecessary copies.
1 parent 2dc17fb commit 67df80c

File tree

4 files changed

+59
-22
lines changed

4 files changed

+59
-22
lines changed

sbe-tool/src/main/cpp/otf/Encoding.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ inline std::size_t lengthOfType(PrimitiveType type)
156156
class PrimitiveValue
157157
{
158158
public:
159-
PrimitiveValue(PrimitiveType type, std::size_t valueLength, const char *value)
159+
PrimitiveValue(PrimitiveType type, std::size_t valueLength, const char *value) :
160+
m_type(type)
160161
{
161-
m_type = type;
162162
if (0 == valueLength)
163163
{
164164
m_type = PrimitiveType::NONE;

sbe-tool/src/main/cpp/otf/IrDecoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class IrDecoder
150150
FILE *fptr = ::fopen(filename, "rb");
151151
std::uint64_t remaining = length;
152152

153-
if (NULL == fptr)
153+
if (nullptr == fptr)
154154
{
155155
return -1;
156156
}

sbe-tool/src/main/cpp/otf/OtfHeaderDecoder.h

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,42 +30,72 @@ namespace otf {
3030
class OtfHeaderDecoder
3131
{
3232
public:
33-
OtfHeaderDecoder(std::shared_ptr<std::vector<Token>> tokens) :
34-
m_tokens(tokens)
33+
explicit OtfHeaderDecoder(const std::shared_ptr<std::vector<Token>>& tokens)
3534
{
3635
m_encodedLength = tokens->at(0).encodedLength();
3736

37+
Token* blockLengthToken = nullptr;
38+
Token* templateIdToken = nullptr;
39+
Token* schemaIdToken = nullptr;
40+
Token* versionToken = nullptr;
41+
3842
std::for_each(tokens->begin(), tokens->end(), [&](Token& token)
3943
{
4044
const std::string& name = token.name();
41-
const Encoding& encoding = token.encoding();
4245

4346
if (name == "blockLength")
4447
{
45-
m_blockLengthOffset = token.offset();
46-
m_blockLengthType = encoding.primitiveType();
47-
m_blockLengthByteOrder = encoding.byteOrder();
48+
blockLengthToken = &token;
4849
}
4950
else if (name == "templateId")
5051
{
51-
m_templateIdOffset = token.offset();
52-
m_templateIdType = encoding.primitiveType();
53-
m_templateIdByteOrder = encoding.byteOrder();
52+
templateIdToken = &token;
5453
}
5554
else if (name == "schemaId")
5655
{
57-
m_schemaIdOffset = token.offset();
58-
m_schemaIdType = encoding.primitiveType();
59-
m_schemaIdByteOrder = encoding.byteOrder();
56+
schemaIdToken = &token;
6057
}
6158
else if (name == "version")
6259
{
63-
m_schemaVersionOffset = token.offset();
64-
m_schemaVersionType = encoding.primitiveType();
65-
m_schemaVersionByteOrder = encoding.byteOrder();
60+
versionToken = &token;
6661
}
67-
6862
});
63+
64+
if (nullptr == blockLengthToken)
65+
{
66+
throw std::runtime_error("blockLength token not found");
67+
}
68+
69+
m_blockLengthOffset = blockLengthToken->offset();
70+
m_blockLengthType = blockLengthToken->encoding().primitiveType();
71+
m_blockLengthByteOrder = blockLengthToken->encoding().byteOrder();
72+
73+
if (nullptr == templateIdToken)
74+
{
75+
throw std::runtime_error("templateId token not found");
76+
}
77+
78+
m_templateIdOffset = templateIdToken->offset();
79+
m_templateIdType = templateIdToken->encoding().primitiveType();
80+
m_templateIdByteOrder = templateIdToken->encoding().byteOrder();
81+
82+
if (nullptr == schemaIdToken)
83+
{
84+
throw std::runtime_error("schemaId token not found");
85+
}
86+
87+
m_schemaIdOffset = schemaIdToken->offset();
88+
m_schemaIdType = schemaIdToken->encoding().primitiveType();
89+
m_schemaIdByteOrder = schemaIdToken->encoding().byteOrder();
90+
91+
if (nullptr == versionToken)
92+
{
93+
throw std::runtime_error("version token not found");
94+
}
95+
96+
m_schemaVersionOffset = versionToken->offset();
97+
m_schemaVersionType = versionToken->encoding().primitiveType();
98+
m_schemaVersionByteOrder = versionToken->encoding().byteOrder();
6999
}
70100

71101
inline std::uint32_t encodedLength() const
@@ -74,7 +104,7 @@ class OtfHeaderDecoder
74104
}
75105

76106
/*
77-
* All elements must be unsigned integers according to RC3
107+
* All elements must be unsigned integers according to Specification
78108
*/
79109

80110
std::uint64_t getTemplateId(const char *headerBuffer)
@@ -98,7 +128,6 @@ class OtfHeaderDecoder
98128
}
99129

100130
private:
101-
std::shared_ptr<std::vector<Token>> m_tokens;
102131
std::int32_t m_encodedLength;
103132
std::int32_t m_blockLengthOffset;
104133
std::int32_t m_templateIdOffset;

sbe-tool/src/main/cpp/otf/OtfMessageDecoder.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,15 +173,19 @@ static void decodeComposite(
173173
case Signal::BEGIN_COMPOSITE:
174174
decodeComposite(fieldToken, buffer, bufferIndex + offset, length, tokens, i, nextFieldIndex - 1, actingVersion, listener);
175175
break;
176+
176177
case Signal::BEGIN_ENUM:
177178
listener.onEnum(fieldToken, buffer + bufferIndex + offset, *tokens.get(), i, nextFieldIndex - 1, actingVersion);
178179
break;
180+
179181
case Signal::BEGIN_SET:
180182
listener.onBitSet(fieldToken, buffer + bufferIndex + offset, *tokens.get(), i, nextFieldIndex - 1, actingVersion);
181183
break;
184+
182185
case Signal::ENCODING:
183186
listener.onEncoding(token, buffer + bufferIndex + offset, token, actingVersion);
184187
break;
188+
185189
default:
186190
throw std::runtime_error("incorrect signal type in decodeComposite");
187191
}
@@ -223,15 +227,19 @@ static size_t decodeFields(
223227
decodeComposite<TokenListener>(
224228
fieldToken, buffer, offset, length, tokens, tokenIndex, nextFieldIndex - 2, actingVersion, listener);
225229
break;
230+
226231
case Signal::BEGIN_ENUM:
227232
listener.onEnum(fieldToken, buffer + offset, *tokens.get(), tokenIndex, nextFieldIndex - 2, actingVersion);
228233
break;
234+
229235
case Signal::BEGIN_SET:
230236
listener.onBitSet(fieldToken, buffer + offset, *tokens.get(), tokenIndex, nextFieldIndex - 2, actingVersion);
231237
break;
238+
232239
case Signal::ENCODING:
233240
listener.onEncoding(fieldToken, buffer + offset, typeToken, actingVersion);
234241
break;
242+
235243
default:
236244
throw std::runtime_error("incorrect signal type in decodeFields");
237245
}
@@ -247,7 +255,7 @@ std::size_t decodeData(
247255
const char *buffer,
248256
std::size_t bufferIndex,
249257
const std::size_t length,
250-
std::shared_ptr<std::vector<Token>> tokens,
258+
const std::shared_ptr<std::vector<Token>>& tokens,
251259
std::size_t tokenIndex,
252260
const std::size_t numTokens,
253261
std::uint64_t actingVersion,

0 commit comments

Comments
 (0)