• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_BUFFER_H_
12 #define WEBRTC_BASE_BUFFER_H_
13 
14 #include <string.h>
15 
16 #include "webrtc/base/scoped_ptr.h"
17 
18 namespace rtc {
19 
20 // Basic buffer class, can be grown and shrunk dynamically.
21 // Unlike std::string/vector, does not initialize data when expanding capacity.
22 class Buffer {
23  public:
Buffer()24   Buffer() {
25     Construct(NULL, 0, 0);
26   }
Buffer(const void * data,size_t length)27   Buffer(const void* data, size_t length) {
28     Construct(data, length, length);
29   }
Buffer(const void * data,size_t length,size_t capacity)30   Buffer(const void* data, size_t length, size_t capacity) {
31     Construct(data, length, capacity);
32   }
Buffer(const Buffer & buf)33   Buffer(const Buffer& buf) {
34     Construct(buf.data(), buf.length(), buf.length());
35   }
36 
data()37   const char* data() const { return data_.get(); }
data()38   char* data() { return data_.get(); }
39   // TODO: should this be size(), like STL?
length()40   size_t length() const { return length_; }
capacity()41   size_t capacity() const { return capacity_; }
42 
43   Buffer& operator=(const Buffer& buf) {
44     if (&buf != this) {
45       Construct(buf.data(), buf.length(), buf.length());
46     }
47     return *this;
48   }
49   bool operator==(const Buffer& buf) const {
50     return (length_ == buf.length() &&
51             memcmp(data_.get(), buf.data(), length_) == 0);
52   }
53   bool operator!=(const Buffer& buf) const {
54     return !operator==(buf);
55   }
56 
SetData(const void * data,size_t length)57   void SetData(const void* data, size_t length) {
58     ASSERT(data != NULL || length == 0);
59     SetLength(length);
60     memcpy(data_.get(), data, length);
61   }
AppendData(const void * data,size_t length)62   void AppendData(const void* data, size_t length) {
63     ASSERT(data != NULL || length == 0);
64     size_t old_length = length_;
65     SetLength(length_ + length);
66     memcpy(data_.get() + old_length, data, length);
67   }
SetLength(size_t length)68   void SetLength(size_t length) {
69     SetCapacity(length);
70     length_ = length;
71   }
SetCapacity(size_t capacity)72   void SetCapacity(size_t capacity) {
73     if (capacity > capacity_) {
74       rtc::scoped_ptr<char[]> data(new char[capacity]);
75       memcpy(data.get(), data_.get(), length_);
76       data_.swap(data);
77       capacity_ = capacity;
78     }
79   }
80 
TransferTo(Buffer * buf)81   void TransferTo(Buffer* buf) {
82     ASSERT(buf != NULL);
83     buf->data_.reset(data_.release());
84     buf->length_ = length_;
85     buf->capacity_ = capacity_;
86     Construct(NULL, 0, 0);
87   }
88 
89  protected:
Construct(const void * data,size_t length,size_t capacity)90   void Construct(const void* data, size_t length, size_t capacity) {
91     data_.reset(new char[capacity_ = capacity]);
92     SetData(data, length);
93   }
94 
95   scoped_ptr<char[]> data_;
96   size_t length_;
97   size_t capacity_;
98 };
99 
100 }  // namespace rtc
101 
102 #endif  // WEBRTC_BASE_BUFFER_H_
103