CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
buffer.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_UTIL_BUFFER_H_
6 #define CVMFS_UTIL_BUFFER_H_
7 
8 #include <cassert>
9 #include <cstddef>
10 #include <memory>
11 
12 
13 #ifdef CVMFS_NAMESPACE_GUARD
14 namespace CVMFS_NAMESPACE_GUARD {
15 #endif
16 
17 
18 template<typename T, class A = std::allocator<T> >
19 class Buffer {
20  public:
21  typedef typename A::pointer pointer_t;
22 
23  Buffer() : used_(0), size_(0), buffer_(NULL), initialized_(false) { }
24 
25  explicit Buffer(const size_t size)
26  : used_(0), size_(0), buffer_(NULL), initialized_(false) {
27  Allocate(size);
28  }
29 
30  virtual ~Buffer() { Deallocate(); }
31 
32  void Allocate(const size_t size) {
33  assert(!IsInitialized());
34  size_ = size;
35  buffer_ = allocator_.allocate(size_bytes());
36  initialized_ = true;
37  }
38 
39  bool IsInitialized() const { return initialized_; }
40 
41  typename A::pointer ptr() {
42  assert(IsInitialized());
43  return buffer_;
44  }
45  const typename A::pointer ptr() const {
46  assert(IsInitialized());
47  return buffer_;
48  }
49 
50  typename A::pointer free_space_ptr() {
51  assert(IsInitialized());
52  return buffer_ + used();
53  }
54 
55  const typename A::pointer free_space_ptr() const {
56  assert(IsInitialized());
57  return buffer_ + used();
58  }
59 
60  void SetUsed(const size_t items) {
61  assert(items <= size());
62  used_ = items;
63  }
64 
65  void SetUsedBytes(const size_t bytes) {
66  assert(bytes <= size_bytes());
67  assert(bytes % sizeof(T) == 0);
68  used_ = bytes / sizeof(T);
69  }
70 
71  size_t size() const { return size_; }
72  size_t size_bytes() const { return size_ * sizeof(T); }
73  size_t used() const { return used_; }
74  size_t used_bytes() const { return used_ * sizeof(T); }
75  size_t free() const { return size_ - used_; }
76  size_t free_bytes() const { return free() * sizeof(T); }
77 
78  private:
79  Buffer(const Buffer &other) { assert(false); } // no copy!
80  Buffer &operator=(const Buffer &other) { assert(false); }
81 
82  void Deallocate() {
83  if (size_ == 0) {
84  return;
85  }
86  allocator_.deallocate(buffer_, size_bytes());
87  buffer_ = NULL;
88  size_ = 0;
89  used_ = 0;
90  initialized_ = false;
91  }
92 
93  private:
95  size_t used_;
96  size_t size_;
97  typename A::pointer buffer_;
99 };
100 
101 #ifdef CVMFS_NAMESPACE_GUARD
102 } // namespace CVMFS_NAMESPACE_GUARD
103 #endif
104 
105 #endif // CVMFS_UTIL_BUFFER_H_
Buffer(const size_t size)
Definition: buffer.h:25
bool IsInitialized() const
Definition: buffer.h:39
size_t used_
Definition: buffer.h:95
virtual ~Buffer()
Definition: buffer.h:30
void Deallocate()
Definition: buffer.h:82
assert((mem||(size==0))&&"Out Of Memory")
A allocator_
Definition: buffer.h:94
size_t used_bytes() const
Definition: buffer.h:74
size_t used() const
Definition: buffer.h:73
A::pointer free_space_ptr()
Definition: buffer.h:50
A::pointer pointer_t
Definition: buffer.h:21
size_t free_bytes() const
Definition: buffer.h:76
size_t size() const
Definition: buffer.h:71
const A::pointer free_space_ptr() const
Definition: buffer.h:55
A::pointer ptr()
Definition: buffer.h:41
size_t free() const
Definition: buffer.h:75
void SetUsed(const size_t items)
Definition: buffer.h:60
A::pointer buffer_
Definition: buffer.h:97
void Allocate(const size_t size)
Definition: buffer.h:32
Buffer(const Buffer &other)
Definition: buffer.h:79
const A::pointer ptr() const
Definition: buffer.h:45
size_t size_
Definition: buffer.h:96
Buffer()
Definition: buffer.h:23
bool initialized_
Definition: buffer.h:98
Buffer & operator=(const Buffer &other)
Definition: buffer.h:80
Definition: buffer.h:19
void SetUsedBytes(const size_t bytes)
Definition: buffer.h:65
static void size_t size
Definition: smalloc.h:54
size_t size_bytes() const
Definition: buffer.h:72