(file) Return to Buffer.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 a.dunfey 1.3.2.1 //%2006////////////////////////////////////////////////////////////////////////
  2 mike     1.2     //
  3                  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4                  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5                  // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6                  // IBM Corp.; EMC Corporation, The Open Group.
  7                  // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8                  // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9                  // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10                  // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 a.dunfey 1.3.2.1 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12                  // EMC Corporation; Symantec Corporation; The Open Group.
 13 mike     1.2     //
 14                  // Permission is hereby granted, free of charge, to any person obtaining a copy
 15                  // of this software and associated documentation files (the "Software"), to
 16                  // deal in the Software without restriction, including without limitation the
 17                  // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18                  // sell copies of the Software, and to permit persons to whom the Software is
 19                  // furnished to do so, subject to the following conditions:
 20                  // 
 21                  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22                  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23                  // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24                  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25                  // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26                  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27                  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28                  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29                  //
 30                  //==============================================================================
 31                  //
 32                  // Author: Michael E. Brasher (mike-brasher@austin.rr.com -- Inova Europe)
 33                  //
 34 mike     1.2     //%/////////////////////////////////////////////////////////////////////////////
 35                  
 36                  #ifndef Pegasus_Buffer_h
 37                  #define Pegasus_Buffer_h
 38                  
 39                  #include <Pegasus/Common/Config.h>
 40                  #include <Pegasus/Common/Linkage.h>
 41                  #include <cstring>
 42                  
 43                  PEGASUS_NAMESPACE_BEGIN
 44                  
 45                  struct BufferRep
 46                  {
 47                      size_t size;
 48                      size_t cap;
 49                      char data[1];
 50                  };
 51                  
 52                  class PEGASUS_COMMON_LINKAGE Buffer
 53                  {
 54                  public:
 55 mike     1.2     
 56                      Buffer();
 57                  
 58                      Buffer(const Buffer& x);
 59                  
 60                      Buffer(const char* data, size_t size);
 61                  
 62                      ~Buffer();
 63                  
 64                      Buffer& operator=(const Buffer& x);
 65                  
 66                      void swap(Buffer& x);
 67                  
 68                      size_t size() const;
 69                  
 70                      size_t capacity() const;
 71                  
 72                      const char* getData() const;
 73                  
 74                      char get(size_t i) const;
 75                  
 76 mike     1.2         void set(size_t i, char x);
 77                  
 78                      const char& operator[](size_t i) const;
 79                  
 80                      void reserveCapacity(size_t cap);
 81                  
 82                      void grow(size_t size, char x = '\0');
 83                  
 84                      void append(char x);
 85                  
 86                      void append(const char* data, size_t size);
 87                  
 88                      void append(char c1, char c2, char c3, char c4);
 89                  
 90                      void append(
 91                  	char c1, char c2, char c3, char c4, char c5, char c6, char c7, char c8);
 92                  
 93                      void insert(size_t pos, const char* data, size_t size);
 94                  
 95                      void remove(size_t pos, size_t size);
 96                  
 97 mike     1.2         void remove(size_t pos);
 98                  
 99                      void clear();
100                  
101                  private:
102                  
103                      void _reserve_aux(size_t cap);
104                  
105                      void _append_char_aux();
106                  
107                      BufferRep* _rep;
108                      static BufferRep _empty_rep;
109                  };
110                  
111                  inline Buffer::Buffer() : _rep(&_empty_rep)
112                  {
113                  }
114                  
115                  inline Buffer::~Buffer()
116                  {
117                      if (_rep != &_empty_rep)
118 mike     1.2     	free(_rep);
119                  }
120                  
121                  inline void Buffer::swap(Buffer& x)
122                  {
123                      BufferRep* tmp = _rep;
124                      _rep = x._rep;
125                      x._rep = tmp;
126                  }
127                  
128                  inline size_t Buffer::size() const
129                  {
130                      return _rep->size;
131                  }
132                  
133                  inline size_t Buffer::capacity() const
134                  {
135                      return _rep->cap;
136                  }
137                  
138                  inline const char* Buffer::getData() const
139 mike     1.2     {
140                      return _rep->data;
141                  }
142                  
143                  inline char Buffer::get(size_t i) const
144                  {
145                      return _rep->data[i];
146                  }
147                  
148                  inline void Buffer::set(size_t i, char x)
149                  {
150                      _rep->data[i] = x;
151                  }
152                  
153                  inline const char& Buffer::operator[](size_t i) const
154                  {
155                      return _rep->data[i];
156                  }
157                  
158                  inline void Buffer::reserveCapacity(size_t cap)
159                  {
160 mike     1.2         if (cap > _rep->cap)
161                  	_reserve_aux(cap);
162                  }
163                  
164                  inline void Buffer::grow(size_t size, char x)
165                  {
166                      size_t cap = _rep->size + size;
167                  
168                      if (cap > _rep->cap)
169                  	_reserve_aux(cap);
170                  
171                      memset(_rep->data + _rep->size, x, size);
172                      _rep->size += size;
173                  }
174                  
175                  inline void Buffer::append(char x)
176                  {
177                      if (_rep->size == _rep->cap)
178                  	_append_char_aux();
179                  
180                      _rep->data[_rep->size++] = x;
181 mike     1.2     }
182                  
183                  inline void Buffer::append(const char* data, size_t size)
184                  {
185                      size_t cap = _rep->size + size;
186                  
187                      if (cap > _rep->cap)
188                  	_reserve_aux(cap);
189                  
190                      memcpy(_rep->data + _rep->size, data, size);
191                      _rep->size += size;
192                  }
193                  
194                  inline void Buffer::clear()
195                  {
196 mike     1.3         if (_rep != &_empty_rep)
197                  	_rep->size = 0;
198 mike     1.2     }
199                  
200                  inline void Buffer::remove(size_t pos)
201                  {
202                      remove(pos, 1);
203                  }
204                  
205                  inline void Buffer::append(char c1, char c2, char c3, char c4)
206                  {
207                      size_t cap = _rep->size + 4;
208                  
209                      if (cap > _rep->cap)
210                  	_reserve_aux(cap);
211                  
212                      char* p = _rep->data + _rep->size;
213                      p[0] = c1;
214                      p[1] = c2;
215                      p[2] = c3;
216                      p[3] = c4;
217                      _rep->size += 4;
218                  }
219 mike     1.2     
220                  inline void Buffer::append(
221                      char c1, char c2, char c3, char c4, char c5, char c6, char c7, char c8)
222                  {
223                      size_t cap = _rep->size + 8;
224                  
225                      if (cap > _rep->cap)
226                  	_reserve_aux(cap);
227                  
228                      char* p = _rep->data + _rep->size;
229                      p[0] = c1;
230                      p[1] = c2;
231                      p[2] = c3;
232                      p[3] = c4;
233                      p[4] = c5;
234                      p[5] = c6;
235                      p[6] = c7;
236                      p[7] = c8;
237                      _rep->size += 8;
238                  }
239                  
240 mike     1.2     inline bool operator==(const Buffer& x, const Buffer& y)
241                  {
242                      return memcmp(x.getData(), y.getData(), x.size()) == 0;
243                  }
244                  
245                  PEGASUS_NAMESPACE_END
246                  
247                  #endif /* Pegasus_Buffer_h */

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2