blob: c7fb9599426c5c6cc8c0ba5035c535696808540d [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
kwiberg@webrtc.org11426dc2015-02-11 14:30:34 +000016#include "webrtc/base/common.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000017#include "webrtc/base/scoped_ptr.h"
18
19namespace rtc {
20
21// Basic buffer class, can be grown and shrunk dynamically.
22// Unlike std::string/vector, does not initialize data when expanding capacity.
23class Buffer {
24 public:
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000025 Buffer();
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000026 explicit Buffer(size_t size);
27 Buffer(const void* data, size_t size);
28 Buffer(const void* data, size_t size, size_t capacity);
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +000029 Buffer(const Buffer& buf);
30 ~Buffer();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000031
32 const char* data() const { return data_.get(); }
33 char* data() { return data_.get(); }
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000034 size_t size() const { return size_; }
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000035 size_t capacity() const { return capacity_; }
36
37 Buffer& operator=(const Buffer& buf) {
38 if (&buf != this) {
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000039 Construct(buf.data(), buf.size(), buf.size());
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000040 }
41 return *this;
42 }
43 bool operator==(const Buffer& buf) const {
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000044 return (size_ == buf.size() && memcmp(data_.get(), buf.data(), size_) == 0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000045 }
46 bool operator!=(const Buffer& buf) const {
47 return !operator==(buf);
48 }
49
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000050 void SetData(const void* data, size_t size) {
51 ASSERT(data != NULL || size == 0);
52 SetSize(size);
53 memcpy(data_.get(), data, size);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054 }
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000055 void AppendData(const void* data, size_t size) {
56 ASSERT(data != NULL || size == 0);
57 size_t old_size = size_;
58 SetSize(size_ + size);
59 memcpy(data_.get() + old_size, data, size);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000060 }
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000061 void SetSize(size_t size) {
62 SetCapacity(size);
63 size_ = size;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064 }
65 void SetCapacity(size_t capacity) {
66 if (capacity > capacity_) {
67 rtc::scoped_ptr<char[]> data(new char[capacity]);
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000068 memcpy(data.get(), data_.get(), size_);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000069 data_.swap(data);
70 capacity_ = capacity;
71 }
72 }
73
74 void TransferTo(Buffer* buf) {
75 ASSERT(buf != NULL);
76 buf->data_.reset(data_.release());
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000077 buf->size_ = size_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000078 buf->capacity_ = capacity_;
79 Construct(NULL, 0, 0);
80 }
81
82 protected:
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000083 void Construct(const void* data, size_t size, size_t capacity) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000084 data_.reset(new char[capacity_ = capacity]);
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000085 SetData(data, size);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 }
87
88 scoped_ptr<char[]> data_;
kwiberg@webrtc.orgeebcab52015-03-24 09:19:06 +000089 size_t size_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000090 size_t capacity_;
91};
92
93} // namespace rtc
94
95#endif // WEBRTC_BASE_BUFFER_H_