20 #define MTL_INSTRUMENT_BUFFER_TYPE char
47 std::vector<MTL_INSTRUMENT_BUFFER_TYPE> m_Vector;
53 : m_Vector(), m_Size(0)
64 : m_Vector(), m_Size(0)
68 assign(pData, pData + DataLen);
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))
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;
230 sToken(std::vector<char>::const_iterator b, std::vector<char>::const_iterator e)
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;
#define MTL_INSTRUMENT_BUFFER_TYPE
Synchronization primitives.
CSCPIBuffer(const MTL_INSTRUMENT_BUFFER_TYPE *pData, size_t DataLen)
Constructor: initialize with data provided.
void resize(size_t size)
Resize the buffer.
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::const_iterator end() const
Return a const iterator to the end of the buffer.
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::const_iterator begin() const
Return a const iterator to the beginning of the buffer.
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::iterator end()
Return an iterator to the end of the buffer.
MTL_INSTRUMENT_BUFFER_TYPE * data() noexcept
Return a pointer to the data.
void reserve(size_t capacity)
Allocate at least a given amount of space.
void clear()
Clear by setting the buffer size to zero.
CSCPIBuffer(size_t InitialCapacity=2048)
Constructor: new empty buffer.
std::vector< MTL_INSTRUMENT_BUFFER_TYPE >::iterator begin()
Return an iterator to the beginning of the buffer.
void assign(const MTL_INSTRUMENT_BUFFER_TYPE *First, const MTL_INSTRUMENT_BUFFER_TYPE *Last)
Copy the given data into the buffer: variant with begin/end.
size_t capacity() const
Return the buffer capacity (allocated size).
size_t size() const
Return the buffer size.
virtual ~CSCPIBuffer()
Destructor.
void assign(const MTL_INSTRUMENT_BUFFER_TYPE *pData, size_t n)
Copy the given data into the buffer: variant with pointer/size.
const MTL_INSTRUMENT_BUFFER_TYPE * data() const noexcept
Return a const pointer to the data.
MTL_INSTRUMENT_BUFFER_TYPE & operator[](size_t n)
Return byte n of the buffer.
bool GetNext(std::vector< char >::const_iterator &rNextBegin, std::vector< char >::const_iterator &rNextEnd, const char Separator=';')
Find the next token.
const tTokens Tokenize(const char Separator=';', size_t Offset=0)
Split the buffer into tokens.
std::vector< char >::const_iterator begin()
Return the beginning of the data to be parsed.
CSCPIBufferParser(std::vector< char >::const_iterator begin, std::vector< char >::const_iterator end)
Constructor.
std::vector< sToken > tTokens
List of tokens.
std::vector< char >::const_iterator end()
Return the end of the data to be parsed.
void SetNextOffset(std::vector< char >::const_iterator Offset)
Manually set the offset to the next token.
std::recursive_mutex CRecursiveMutex
Recursive Mutex.
Location of a token within a buffer.
std::vector< char >::const_iterator end
sToken(std::vector< char >::const_iterator b, std::vector< char >::const_iterator e)
Constructor.
std::vector< char >::const_iterator begin
Beginning of the token.