Home | History | Annotate | Download | only in memory
      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.
     20 class 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.
     38 class 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.
     58 class 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