@@ -30,42 +30,72 @@ namespace otf {
3030class OtfHeaderDecoder
3131{
3232public:
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
100130private:
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;
0 commit comments