18 namespace Instrument {
20 #define MTL_INSTRUMENT_BUFFER_TYPE char
47 std::vector<MTL_INSTRUMENT_BUFFER_TYPE> m_Vector;
53 : m_Vector(), m_Size(0)
57 reserve(InitialCapacity);
64 : m_Vector(), m_Size(0)
68 assign(pData, pData + DataLen);
87 if (capacity > m_Vector.size())
88 m_Vector.resize(capacity);
97 if (size > m_Vector.size())
100 m_Vector.resize(size);
118 return m_Vector.size();
122 std::vector<MTL_INSTRUMENT_BUFFER_TYPE>::iterator
begin()
126 return m_Vector.begin();
130 std::vector<MTL_INSTRUMENT_BUFFER_TYPE>::const_iterator
begin()
const
134 return m_Vector.begin();
138 std::vector<MTL_INSTRUMENT_BUFFER_TYPE>::iterator
end()
142 return m_Vector.begin() + m_Size;
146 std::vector<MTL_INSTRUMENT_BUFFER_TYPE>::const_iterator
end()
const
150 return m_Vector.begin() + m_Size;
158 return m_Vector.data();
166 return m_Vector.data();
192 if (capacity() < (
size_t)(Last - First))
193 reserve(Last - First);
194 std::copy(First, Last, m_Vector.begin());
195 m_Size = Last - First;
207 std::copy(pData, pData + n, m_Vector.begin());
219 std::vector<char>::const_iterator m_Bbegin;
220 std::vector<char>::const_iterator m_Bend;
221 std::vector<char>::const_iterator m_SplitOffset;
225 std::vector<char>::const_iterator
begin;
226 std::vector<char>::const_iterator
end;
227 sToken(std::vector<char>::const_iterator b, std::vector<char>::const_iterator e)
231 : begin(b), end(e) {}
239 CSCPIBufferParser(std::vector<char>::const_iterator begin, std::vector<char>::const_iterator end)
240 : m_Bbegin(begin), m_Bend(end), m_SplitOffset(begin) {}
243 std::vector<char>::const_iterator
begin()
249 std::vector<char>::const_iterator
end()
263 if (m_Bbegin == m_Bend)
267 std::vector<char>::const_iterator l_Start = m_Bbegin + Offset;
268 std::vector<char>::const_iterator l_Next = std::find(l_Start, m_Bend, Separator);
269 l_Tokens.push_back(
sToken(l_Start, l_Next));
272 while (l_Next != m_Bend)
274 l_Start = l_Next + 1;
275 l_Next = std::find(l_Start, m_Bend, Separator);
276 l_Tokens.push_back(
sToken(l_Start, l_Next));
280 const std::string l_Whitespace(
" \t\n\r");
281 for (
auto l_Token : l_Tokens)
283 while (std::string::npos != l_Whitespace.find(*l_Token.begin))
297 bool GetNext(std::vector<char>::const_iterator & rNextBegin, std::vector<char>::const_iterator & rNextEnd,
const char Separator =
';')
300 const std::string l_Whitespace(
" \t\n\r");
301 while (m_SplitOffset < m_Bend &&
302 std::string::npos != l_Whitespace.find(*m_SplitOffset))
306 if (m_SplitOffset == m_Bend)
314 rNextBegin = m_SplitOffset;
315 rNextEnd = std::find(m_SplitOffset, m_Bend, Separator);
318 if (rNextEnd == m_Bend)
319 m_SplitOffset = m_Bend;
321 m_SplitOffset = rNextEnd + 1;
332 m_SplitOffset = Offset;
335 if (m_SplitOffset < m_Bbegin)
336 m_SplitOffset = m_Bbegin;
337 if (m_SplitOffset > m_Bend)
338 m_SplitOffset = m_Bbegin;