1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_MEMORY_REF_COUNTED_MEMORY_H_
6#define BASE_MEMORY_REF_COUNTED_MEMORY_H_
7#pragma once
8
9#include <vector>
10
11#include "base/base_api.h"
12#include "base/memory/ref_counted.h"
13
14// TODO(erg): The contents of this file should be in a namespace. This would
15// require touching >100 files in chrome/ though.
16
17// A generic interface to memory. This object is reference counted because one
18// of its two subclasses own the data they carry, and we need to have
19// heterogeneous containers of these two types of memory.
20class BASE_API RefCountedMemory
21    : public base::RefCountedThreadSafe<RefCountedMemory> {
22 public:
23  // Retrieves a pointer to the beginning of the data we point to. If the data
24  // is empty, this will return NULL.
25  virtual const unsigned char* front() const = 0;
26
27  // Size of the memory pointed to.
28  virtual size_t size() const = 0;
29
30 protected:
31  friend class base::RefCountedThreadSafe<RefCountedMemory>;
32  RefCountedMemory();
33  virtual ~RefCountedMemory();
34};
35
36// An implementation of RefCountedMemory, where the ref counting does not
37// matter.
38class BASE_API RefCountedStaticMemory : public RefCountedMemory {
39 public:
40  RefCountedStaticMemory()
41      : data_(NULL), length_(0) {}
42  RefCountedStaticMemory(const unsigned char* data, size_t length)
43      : data_(data), length_(length) {}
44
45  // Overriden from RefCountedMemory:
46  virtual const unsigned char* front() const;
47  virtual size_t size() const;
48
49 private:
50  const unsigned char* data_;
51  size_t length_;
52
53  DISALLOW_COPY_AND_ASSIGN(RefCountedStaticMemory);
54};
55
56// An implementation of RefCountedMemory, where we own our the data in a
57// vector.
58class BASE_API RefCountedBytes : public RefCountedMemory {
59 public:
60  RefCountedBytes();
61
62  // Constructs a RefCountedBytes object by _copying_ from |initializer|.
63  RefCountedBytes(const std::vector<unsigned char>& initializer);
64
65  // Constructs a RefCountedBytes object by performing a swap. (To non
66  // destructively build a RefCountedBytes, use the constructor that takes a
67  // vector.)
68  static RefCountedBytes* TakeVector(std::vector<unsigned char>* to_destroy);
69
70  // Overriden from RefCountedMemory:
71  virtual const unsigned char* front() const;
72  virtual size_t size() const;
73
74  std::vector<unsigned char> data;
75
76 protected:
77  friend class base::RefCountedThreadSafe<RefCountedBytes>;
78  virtual ~RefCountedBytes();
79
80 private:
81  DISALLOW_COPY_AND_ASSIGN(RefCountedBytes);
82};
83
84#endif  // BASE_MEMORY_REF_COUNTED_MEMORY_H_
85