diff options
Diffstat (limited to 'ndb/include/util/UtilBuffer.hpp')
-rw-r--r-- | ndb/include/util/UtilBuffer.hpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/ndb/include/util/UtilBuffer.hpp b/ndb/include/util/UtilBuffer.hpp new file mode 100644 index 00000000000..97821ee3f9b --- /dev/null +++ b/ndb/include/util/UtilBuffer.hpp @@ -0,0 +1,90 @@ +/* Copyright (C) 2003 MySQL AB + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef __BUFFER_HPP_INCLUDED__ +#define __BUFFER_HPP_INCLUDED__ + +#include <unistd.h> +#include <errno.h> +#include <stdlib.h> + +/* This class represents a buffer of binary data, where you can append + * data at the end, and later read the entire bunch. + * It will take care of the hairy details of realloc()ing the space + * for you + */ +class UtilBuffer { +public: + UtilBuffer() { data = NULL; len = 0; alloc_size = 0; }; + ~UtilBuffer() { if(data) free(data); data = NULL; len = 0; alloc_size = 0; }; + + + int reallocate(size_t newsize) { + if(newsize < len) { + errno = EINVAL; + return -1; + } + void *newdata; + if((newdata = realloc(data, newsize)) == NULL) { + errno = ENOMEM; + return -1; + } + alloc_size = newsize; + data = newdata; + return 0; + }; + + int grow(size_t l) { + if(l > alloc_size) + return reallocate(l); + return 0; + }; + + int append(const void *d, size_t l) { + int ret; + ret = grow(len+l); + if(ret != 0) + return ret; + + memcpy((char *)data+len, d, l); + len+=l; + + return 0; + }; + + int assign(const void * d, size_t l) { + if (data) free(data); + data = NULL; + len = 0; + alloc_size = 0; + return append(d, l); + } + + void clear() { + len = 0; + } + + int length() const { return len; }; + + void *get_data() const { return data; }; +private: + void *data; /* Pointer to data storage */ + size_t len; /* Size of the stored data */ + size_t alloc_size; /* Size of the allocated space, + * i.e. len can grow to this size */ +}; + +#endif /* !__BUFFER_HPP_INCLUDED__ */ |