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