Listing 2
template< . . . >
class fast_string_concatenator
{
. . . // Public interface
private:
struct Data
{
struct CString
{
size_t len;
char_type const *s;
};
union DataRef
{
CString cstring;
char_type ch;
class_type const *concat;
};
enum DataType
{
seed // Argument was the seed type
, single // Argument was a single character
, cstring // Argument was a C-string or string object
, concat // Argument was another concatenator
};
Data(string_type const &s);
Data(char_type const *s);
Data(char_type ch s);
Data(class_type const &fc);
Data(fsc_seed const &fc);
size_t length() const;
char_type *write(char_type *s) const;
DataType const type;
DataRef ref;
};
friend struct Data;
private:
char_type *write(char_type *s) const;
private:
Data m_lhs;
Data m_rhs;
. . .
};