UtilBuffer.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef __BUFFER_HPP_INCLUDED__
  14. #define __BUFFER_HPP_INCLUDED__
  15. #include <ndb_global.h>
  16. /* This class represents a buffer of binary data, where you can append
  17.  * data at the end, and later read the entire bunch.
  18.  * It will take care of the hairy details of realloc()ing the space
  19.  * for you
  20.  */
  21. class UtilBuffer {
  22. public:
  23.   UtilBuffer() { data = NULL; len = 0; alloc_size = 0; };
  24.   ~UtilBuffer() { if(data) free(data); data = NULL; len = 0; alloc_size = 0; };
  25.   int reallocate(size_t newsize) {
  26.     if(newsize < len) {
  27.       errno = EINVAL;
  28.       return -1;
  29.     }
  30.     void *newdata;
  31.     if((newdata = realloc(data, newsize)) == NULL) {
  32.       errno = ENOMEM;
  33.       return -1;
  34.     }
  35.     alloc_size = newsize;
  36.     data = newdata;
  37.     return 0;
  38.   };
  39.   int grow(size_t l) {
  40.     if(l > alloc_size)
  41.       return reallocate(l);
  42.     return 0;
  43.   };
  44.   int append(const void *d, size_t l) {
  45.     int ret;
  46.     ret = grow(len+l);
  47.     if(ret != 0)
  48.       return ret;
  49.       
  50.     memcpy((char *)data+len, d, l);
  51.     len+=l;
  52.     return 0;
  53.   };
  54.   void * append(size_t l){
  55.     if(grow(len+l) != 0)
  56.       return 0;
  57.     void * ret = (char*)data+len;
  58.     len += l;
  59.     return ret;
  60.   }
  61.   
  62.   int assign(const void * d, size_t l) {
  63.     if (data) free(data);
  64.     data = NULL;
  65.     len = 0;
  66.     alloc_size = 0;
  67.     return append(d, l);
  68.   }
  69.   void clear() {
  70.     len = 0;
  71.   }
  72.   int length() const { return len; };
  73.   void *get_data() const { return data; };
  74. private:
  75.   void *data;          /* Pointer to data storage */
  76.   size_t len;          /* Size of the stored data */
  77.   size_t alloc_size;   /* Size of the allocated space,
  78. *  i.e. len can grow to this size */
  79. };
  80. #endif /* !__BUFFER_HPP_INCLUDED__ */