inlib  1.2.0
Public Member Functions | Protected Member Functions | Protected Attributes
inlib::io::xrbuf Class Reference
Inheritance diagram for inlib::io::xrbuf:
Inheritance graph
[legend]
Collaboration diagram for inlib::io::xrbuf:
Collaboration graph
[legend]

List of all members.

Public Member Functions

virtual bool read (uchar &a_x)
virtual bool read (char &a_x)
virtual bool read (uint16 &a_x)
virtual bool read (int16 &a_x)
virtual bool read (uint32 &a_x)
virtual bool read (int32 &a_x)
virtual bool read (uint64 &a_x)
virtual bool read (int64 &a_x)
virtual bool read (bool &a_v)
virtual bool read (float &a_v)
virtual bool read (double &a_v)
virtual bool read_cstr (char *&a_cstr)
virtual bool read_vec (uint32 &a_n, uchar *&a_x)
virtual bool read_vec (uint32 &a_n, char *&a_x)
virtual bool read_vec (uint32 &a_n, uint16 *&a_x)
virtual bool read_vec (uint32 &a_n, int16 *&a_x)
virtual bool read_vec (uint32 &a_n, uint32 *&a_x)
virtual bool read_vec (uint32 &a_n, int32 *&a_x)
virtual bool read_vec (uint32 &a_n, uint64 *&a_x)
virtual bool read_vec (uint32 &a_n, int64 *&a_x)
virtual bool read_vec (uint32 &a_n, float *&a_x)
virtual bool read_vec (uint32 &a_n, double *&a_x)
virtual bool read_vec (uint32 &a_n, bool *&a_x)
virtual bool read_vec (std::vector< std::string > &a_a)
virtual bool read_std_vec_vec (std_vec_vec_uint_t &a_vv)
virtual bool read_std_vec_vec (std_vec_vec_float_t &a_vv)
virtual bool read_std_vec_vec (std_vec_vec_string_t &a_vv)
 xrbuf (std::ostream &a_out, uint32 a_size=1014)
virtual ~xrbuf ()
bool copy (uint32 a_size, const char *a_buffer)

Protected Member Functions

 xrbuf (const xrbuf &a_from)
xrbufoperator= (const xrbuf &)
template<class ta_type >
bool _read_strtol (ta_type &a_v)
template<class ta_type , class ta_ret_type >
bool _read (ta_type &a_v, inlib::s2int64_func a_func)
template<class ta_type >
bool _read_array (uint32 &a_n, ta_type *&a_a)
template<class T >
bool _read_std_vec_vec (std::vector< std::vector< T > > &a_vv)
uint32 _remaining () const

Protected Attributes

std::ostream & m_out
uint32 m_size
char * m_buffer
char * m_max
char * m_pos

Detailed Description

Definition at line 22 of file xrbuf.


Constructor & Destructor Documentation

inlib::io::xrbuf::xrbuf ( std::ostream &  a_out,
uint32  a_size = 1014 
) [inline]

Definition at line 212 of file xrbuf.

  :m_out(a_out)
  ,m_size(0)
  ,m_buffer(0)
  ,m_max(0)
  ,m_pos(0)
  {
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
    m_size = a_size;
    m_buffer = new char[m_size];
    m_max = m_buffer+m_size;
    m_pos = m_buffer;
  }
virtual inlib::io::xrbuf::~xrbuf ( ) [inline, virtual]

Definition at line 227 of file xrbuf.

                  {
    delete [] m_buffer;
#ifdef INLIB_MEM
    mem::decrement(s_class().c_str());
#endif
  }
inlib::io::xrbuf::xrbuf ( const xrbuf a_from) [inline, protected]

Definition at line 234 of file xrbuf.

  : irbuf(a_from)
  ,m_out(a_from.m_out){
#ifdef INLIB_MEM
    mem::increment(s_class().c_str());
#endif
  }

Member Function Documentation

template<class ta_type , class ta_ret_type >
bool inlib::io::xrbuf::_read ( ta_type &  a_v,
inlib::s2int64_func  a_func 
) [inline, protected]

Definition at line 268 of file xrbuf.

                                                    {
    //we expect at m_pos a C string (null terminated).
    char* end;
    ta_ret_type v = a_func(m_pos,&end,10);
    if(end==m_pos) return false;
    if((end+1)>m_max) return false;
    m_pos = end+1;
    a_v = (ta_type)v;
    return true;
  }
template<class ta_type >
bool inlib::io::xrbuf::_read_array ( uint32 a_n,
ta_type *&  a_a 
) [inline, protected]

Definition at line 280 of file xrbuf.

                                                    {
    // assume that the whole remaining buffer containes {xxx0}.
    // a_a is allocated by this method.
    a_n = 0;
    uint32 a_size = 100;
    a_a = new ta_type[a_size];
    if(!a_a) return false;
    char* pos = m_pos;
    char* begin = m_pos;
    uint32 sz = _remaining();
    if(sz==1) {a_n = 0;return true;}
    for(uint32 index=0;index<sz;index++,pos++) {
      if( ((*pos)==' ')  ||
          ((*pos)=='\0') ){
        m_pos = begin;
        ta_type v;
        if(!read(v)) {
          delete [] a_a;
          a_a = 0;
          a_n = 0;
          return false;
        }
        if((a_n+1)>a_size) {
          uint32 new_a_size = 2*a_size;
          if(!realloc<ta_type>(a_a,new_a_size,a_size)) {a_n=0;return false;}
          a_size = new_a_size;
        }
        a_a[a_n] = v;
        a_n++;
        begin = pos+1;

        if((*pos)=='\0') return true;
      }
    }
    //FIXME : return false if not ending with null char.
    return true;
  }
template<class T >
bool inlib::io::xrbuf::_read_std_vec_vec ( std::vector< std::vector< T > > &  a_vv) [inline, protected]

Definition at line 319 of file xrbuf.

                                                          {
    // <num> <num> <num>\n<num> <num> <num>\n...\n<num> <num>0
    a_vv.clear();
    char* pos = m_pos;
    char* begin = m_pos;
    uint32 sz = _remaining();
    for(uint32 index=0;index<sz;index++,pos++) {
      if((*pos)=='\0') {
        m_pos = begin;

        uint32 n;
        T* v;
        if(!_read_array<T>(n,v)) { //v is allocated with new T[].
          a_vv.clear();
          return false;
        }
        if(n) {
          std::vector<T> sv(n);
          for(unsigned int i=0;i<n;i++) sv[i] = v[i];
          a_vv.push_back(sv);
        }

        delete [] v;

        return true;

      } else if( ((*pos)=='\\') && 
                 ((pos+1)<=m_max) &&
                 ((*(pos+1))=='n') ){
        m_pos = begin;
        char old_char = *pos;
        *pos = '\0';

        uint32 n;
        T* v;
        if(!_read_array<T>(n,v)) { //v is allocated with new T[].
          *pos = old_char;       
          a_vv.clear();
          return false;
        }
        *pos = old_char;       

        if(n) {
          std::vector<T> sv(n);
          for(unsigned int i=0;i<n;i++) sv[i] = v[i];
          a_vv.push_back(sv);
        }

        delete [] v;

        begin = pos+2;
      }
    }

    return true;
  }
template<class ta_type >
bool inlib::io::xrbuf::_read_strtol ( ta_type &  a_v) [inline, protected]

Definition at line 255 of file xrbuf.

                                  {
    //introduced to compile on Android.
    //we expect at m_pos a C string (null terminated).
    char* end;
    long v = ::strtol(m_pos,&end,10);
    if(end==m_pos) return false;
    if((end+1)>m_max) return false;
    m_pos = end+1;
    a_v = (ta_type)v;
    return true;
  }
uint32 inlib::io::xrbuf::_remaining ( ) const [inline, protected]

Definition at line 376 of file xrbuf.

{return (uint32)(m_max - m_pos);}
bool inlib::io::xrbuf::copy ( uint32  a_size,
const char *  a_buffer 
) [inline]

Definition at line 243 of file xrbuf.

                                                {
    delete [] m_buffer;
    m_buffer = new char[a_size];
    if(!m_buffer) {m_size = 0;m_max = 0;m_pos = 0;return false;}
    ::memcpy(m_buffer,a_buffer,a_size);
    m_size = a_size;
    m_max = m_buffer + m_size;
    m_pos = m_buffer;
    return true;
  }
xrbuf& inlib::io::xrbuf::operator= ( const xrbuf ) [inline, protected]

Definition at line 241 of file xrbuf.

{return *this;}
virtual bool inlib::io::xrbuf::read ( uchar a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 30 of file xrbuf.

{return _read_strtol<uchar>(a_x);}
virtual bool inlib::io::xrbuf::read ( char &  a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 31 of file xrbuf.

{return _read_strtol<char>(a_x);}
virtual bool inlib::io::xrbuf::read ( uint16 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 32 of file xrbuf.

{return _read_strtol<uint16>(a_x);}
virtual bool inlib::io::xrbuf::read ( int16 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 33 of file xrbuf.

{return _read_strtol<int16>(a_x);}
virtual bool inlib::io::xrbuf::read ( uint32 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 34 of file xrbuf.

{return _read_strtol<uint32>(a_x);}
virtual bool inlib::io::xrbuf::read ( int32 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 35 of file xrbuf.

{return _read_strtol<int32>(a_x);}
virtual bool inlib::io::xrbuf::read ( uint64 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 37 of file xrbuf.

                                {
    return _read<uint64,int64>(a_x,inlib::s2int64);
  }
virtual bool inlib::io::xrbuf::read ( int64 a_x) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 40 of file xrbuf.

                               {
    return _read<int64,int64>(a_x,inlib::s2int64);
  }
virtual bool inlib::io::xrbuf::read ( bool &  a_v) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 44 of file xrbuf.

                               {
    uchar v;
    bool status = read(v);
    a_v = (v==1?true:false);
    return status;
  }
virtual bool inlib::io::xrbuf::read ( float &  a_v) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 51 of file xrbuf.

                               {
    char* end;
#ifdef WIN32
    double v = ::strtod(m_pos,&end);
    a_v = (float)v;
#else
    a_v = ::strtof(m_pos,&end);
#endif
    if(end==m_pos) return false;
    if((end+1)>m_max) return false;
    m_pos = end+1;
    return true;
  }
virtual bool inlib::io::xrbuf::read ( double &  a_v) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 64 of file xrbuf.

                                {
    char* end;
    a_v = ::strtod(m_pos,&end);
    if(end==m_pos) return false;
    if((end+1)>m_max) return false;
    m_pos = end+1;
    return true;
  }
virtual bool inlib::io::xrbuf::read_cstr ( char *&  a_cstr) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 73 of file xrbuf.

                                        {
    char* pos = m_pos;
    char* begin = m_pos;
    uint32 sz = _remaining();
    for(uint32 index=0;index<sz;index++,pos++) {
      if((*pos)=='\0') {
        diff_pointer_t l = pos-begin;
        a_cstr = str_new(l);
        ::memcpy(a_cstr,begin,l);
        begin = pos+1;
        m_pos = begin;
        return true; //stop at first string found.
      }
    }
    a_cstr = 0;
    return false;
  }
virtual bool inlib::io::xrbuf::read_std_vec_vec ( std_vec_vec_uint_t a_vv) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 165 of file xrbuf.

                                                          {
    return _read_std_vec_vec<unsigned int>(a_vv);
  }
virtual bool inlib::io::xrbuf::read_std_vec_vec ( std_vec_vec_float_t a_vv) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 168 of file xrbuf.

                                                           {
    return _read_std_vec_vec<float>(a_vv);
  }
virtual bool inlib::io::xrbuf::read_std_vec_vec ( std_vec_vec_string_t a_vv) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 171 of file xrbuf.

                                                            {
    // <str>\n<str>\n<num>\t<str>\n<str>\n<str>\t...\t<str>\n<str>0
    a_vv.clear();
    char* pos = m_pos;
    char* begin = m_pos;
    uint32 sz = _remaining();
    for(uint32 index=0;index<sz;index++,pos++) {
      if((*pos)=='\0') {
        m_pos = begin;
        std::vector<std::string> v;
        if(!read_vec(v)) {
          a_vv.clear();
          return false;
        }
        a_vv.push_back(v);
        return true;

      } else if( ((*pos)=='\\') && 
                 ((pos+1)<=m_max) &&
                 ((*(pos+1))=='t') ){
        m_pos = begin;
        char old_char = *pos;
        *pos = '\0';

        std::vector<std::string> v;
        if(!read_vec(v)) {
          *pos = old_char;       
          a_vv.clear();
          return false;
        }
        *pos = old_char;       

        a_vv.push_back(v);

        begin = pos+2;
      }
    }

    return true;
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
uchar *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 91 of file xrbuf.

                                                {
    return _read_array<uchar>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
char *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 94 of file xrbuf.

                                               {
    return _read_array<char>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
uint16 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 97 of file xrbuf.

                                                 {
    return _read_array<uint16>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
int16 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 100 of file xrbuf.

                                                {
    return _read_array<int16>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
uint32 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 103 of file xrbuf.

                                                 {
    return _read_array<uint32>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
int32 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 106 of file xrbuf.

                                                {
    return _read_array<int32>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
uint64 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 109 of file xrbuf.

                                                 {
    return _read_array<uint64>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
int64 *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 112 of file xrbuf.

                                                {
    return _read_array<int64>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
float *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 115 of file xrbuf.

                                                {
    return _read_array<float>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
double *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 118 of file xrbuf.

                                                 {
    return _read_array<double>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( uint32 a_n,
bool *&  a_x 
) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 121 of file xrbuf.

                                               {
    return _read_array<bool>(a_n,a_x);
  }
virtual bool inlib::io::xrbuf::read_vec ( std::vector< std::string > &  a_a) [inline, virtual]

Implements inlib::io::irbuf.

Definition at line 125 of file xrbuf.

                                                  {
    // <chars>\n<chars>\n<chars>0
    a_a.clear();
    typedef cstr_t ta_type;
    char* pos = m_pos;
    char* begin = m_pos;
    uint32 sz = _remaining();
    for(uint32 index=0;index<sz;index++,pos++) {
      if((*pos)=='\0') {
        m_pos = begin;
        ta_type v;
        if(!read_cstr(v)) { //v is allocated with str_new.
          a_a.clear();
          return false;
        }
        if(v) a_a.push_back(v);
        begin = pos+1;
        return true;

      } else if( ((*pos)=='\\') && 
                 ((pos+1)<=m_max) &&
                 ((*(pos+1))=='n') ){
        m_pos = begin;
        char old_char = *pos;
        *pos = '\0';
        ta_type v;
        if(!read_cstr(v)) { //v is allocated with str_new.
          *pos = old_char;       
          a_a.clear();
          return false;
        }
        *pos = old_char;       
        if(v) a_a.push_back(v);
        begin = pos+2;
      }
    }
    //FIXME : return false if not ending with null char.
    return true;
  }

Member Data Documentation

char* inlib::io::xrbuf::m_buffer [protected]

Definition at line 380 of file xrbuf.

char* inlib::io::xrbuf::m_max [protected]

Definition at line 381 of file xrbuf.

std::ostream& inlib::io::xrbuf::m_out [protected]

Definition at line 378 of file xrbuf.

char* inlib::io::xrbuf::m_pos [protected]

Definition at line 382 of file xrbuf.

Definition at line 379 of file xrbuf.


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines