//
// aegis - project change supervisor
// Copyright (C) 2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program. If not, see .
//
#ifndef COMMON_WSTRING_ACCUMULATOR_H
#define COMMON_WSTRING_ACCUMULATOR_H
#include
/**
* The wstring_accumulator class is used to accumulate wide characters
* into a buffer, for turning into a wide string.
*/
class wstring_accumulator
{
public:
/**
* The destructor. Thou shalt not derive from this class because
* it isn't virtual.
*/
~wstring_accumulator();
/**
* The default constructor.
*/
wstring_accumulator();
/**
* The copy constructor.
*/
wstring_accumulator(const wstring_accumulator &);
/**
* The assignment operator.
*/
wstring_accumulator &operator=(const wstring_accumulator &);
/**
* The mkstr method is used to take the current contents of the
* accumulated buffer and turn it into a wide string.
*/
wstring mkstr() const;
/**
* The push_back method is used to append another character to the
* end of the accumulator.
*
* \param c
* The character to be appended to the buffer.
*/
void
push_back(wchar_t c)
{
if (length < maximum)
buffer[length++] = c;
else
overflow(c);
}
/**
* The push_back method is used to append an array of characters to
* the end of the accumulator.
*
* \param data
* The data to be appended to the buffer.
* \param len
* The number of bytes of data.
*/
void push_back(const wchar_t *data, size_t len);
/**
* The push_back method is used to append a NUL terminated string
* to the end of the accumulator.
*
* \param data
* The string to be appended to the buffer.
*/
void push_back(const wchar_t *data);
/**
* The push_back method is used to append another string
* accumulator to the end of this accumulator.
*
* \param data
* The string to be appended to the buffer.
*/
void push_back(const wstring_accumulator &data);
/**
* The push_back method is used to append another string
* accumulator to the end of this accumulator.
*
* \param data
* The string to be appended to the buffer.
*/
void push_back(const wstring &data);
/**
* The clear method is used to reset the length of the accumulated
* string to zero.
*/
void clear() { length = 0; }
/**
* The size method is used to obtain the current size of the buffer
* in characters.
*/
size_t size() const { return length; }
/**
* The empty method is used to determine if the buffer is empty
* (has a size of zero).
*/
bool empty() const { return (length == 0); }
/**
* The pop_back method is used to remove the last character from
* the buffer.
*/
void pop_back() { if (length) --length; }
/**
* The back method is used to obtain the last character in the
* buffer, or NUL if the buffer is empty.
*/
wchar_t back() { return (length ? buffer[length - 1] : 0); }
/**
* The get_data method is used to obtain a pointer to the base of
* the array of characters being accumulated.
*
* \note
* The pointer is only garanteed to be valid until the next
* push_back method call.
* \note
* Please use this methdo as little as possible.
*/
const wchar_t *get_data() const { return (buffer ? buffer : L""); }
/**
* The array index operator is used to obtain thr nth character in
* the buffer.
*
* \note
* No array bounds checking is performed. If you really stuff
* up, it will segfault. Caveat emptor.
*/
wchar_t operator[](size_t n) { return buffer[n]; }
private:
/**
* The overflow method is used to append another character to the
* end of the accumulator. It is called by the putch method when
* it get too too hard (and a new buffer is needed).
*
* \param c
* The character to be appended to the buffer.
*/
void overflow(wchar_t c);
/**
* The length instance variable is used to remember how many
* characters in the buffer are significant.
*/
size_t length;
/**
* The length instance variable is used to remember the allocated
* size of the buffer.
*/
size_t maximum;
/**
* The length instance variable is used to remember the base of an
* array of characters in the heap.
*/
wchar_t *buffer;
};
#endif // COMMON_WSTRING_ACCUMULATOR_H