00010:
00020:
#if !defined(SERIALSTRING_H_INCLUDED)
#define SERIALSTRING_H_INCLUDED
00030: #include <string.h>
#include <string>
#include <memory>
#include <iterator>
template<typename CHAR>
00040: class SerialString
{
const CHAR* pBegin;
bool self_delete;
public:
00050:
SerialString( const CHAR* p) : pBegin(p), self_delete(false) {}
00060: explicit SerialString(int n) : pBegin(new CHAR[n] ), self_delete(true) {}
CHAR* data() { return const_cast<CHAR*>(pBegin); }
00070:
~SerialString() { if (self_delete) delete[] data(); }
00080:
class iterator : public std::iterator<std::forward_iterator_tag, const CHAR*>
{
const CHAR* ptr;
public:
00090: iterator( const CHAR* p) : ptr(p) {}
const CHAR* operator*() const
{ return ptr; }
const CHAR* Ptr() const
{return ptr; }
00100:
iterator operator++()
{ ptr +=std::char_traits<CHAR>::length(ptr) + 1; return *this; }
iterator operator++(int)
00110: { iterator t(ptr); ptr += std::char_traits<CHAR>::length(ptr) + 1; return t; }
static bool Equal(const iterator& lhs, const iterator& rhs)
{
00120: return lhs.ptr==rhs.ptr ||
(lhs.ptr==0 && *rhs.ptr==CHAR('\0') ) ||
(rhs.ptr==0 && *lhs.ptr == CHAR('\0') );
}
};
00130:
00140: iterator begin() const { return iterator(pBegin); }
iterator end() const { return iterator(0); }
};
template<typename CHAR>
inline bool operator==(const SerialString<CHAR>::iterator& lhs,
const SerialString<CHAR>::iterator& rhs)
{
00150: return SerialString<CHAR>::iterator::Equal(lhs, rhs);
}
template<typename CHAR>
inline bool operator!=(const SerialString<CHAR>::iterator& lhs,
const SerialString<CHAR>::iterator& rhs)
{
return ! SerialString<CHAR>::iterator::Equal(lhs,rhs);
}
00160:
#include <ostream>
template<typename CHAR>
inline std::ostream& operator<<(std::ostream& os,
SerialString<CHAR>::iterator it)
{
os << it.Ptr();
return os;
}
00170:
#endif