15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_MEMORY_REF_COUNTED_MEMORY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_MEMORY_REF_COUNTED_MEMORY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A generic interface to memory. This object is reference counted because one
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of its two subclasses own the data they carry, and we need to have
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// heterogeneous containers of these two types of memory.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT RefCountedMemory
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<RefCountedMemory> {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves a pointer to the beginning of the data we point to. If the data
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is empty, this will return NULL.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const unsigned char* front() const = 0;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size of the memory pointed to.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t size() const = 0;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if |other| is byte for byte equal.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Equals(const scoped_refptr<RefCountedMemory>& other) const;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Handy method to simplify calling front() with a reinterpret_cast.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template<typename T> const T* front_as() const {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return reinterpret_cast<const T*>(front());
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<RefCountedMemory>;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefCountedMemory();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RefCountedMemory();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An implementation of RefCountedMemory, where the ref counting does not
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// matter.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT RefCountedStaticMemory : public RefCountedMemory {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefCountedStaticMemory()
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : data_(NULL), length_(0) {}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RefCountedStaticMemory(const void* data, size_t length)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : data_(static_cast<const unsigned char*>(length ? data : NULL)),
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        length_(length) {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from RefCountedMemory:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const unsigned char* front() const OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t size() const OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RefCountedStaticMemory();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned char* data_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RefCountedStaticMemory);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// An implementation of RefCountedMemory, where we own the data in a vector.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT RefCountedBytes : public RefCountedMemory {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefCountedBytes();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a RefCountedBytes object by _copying_ from |initializer|.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit RefCountedBytes(const std::vector<unsigned char>& initializer);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Constructs a RefCountedBytes object by copying |size| bytes from |p|.
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RefCountedBytes(const unsigned char* p, size_t size);
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a RefCountedBytes object by performing a swap. (To non
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destructively build a RefCountedBytes, use the constructor that takes a
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector.)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static RefCountedBytes* TakeVector(std::vector<unsigned char>* to_destroy);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from RefCountedMemory:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const unsigned char* front() const OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t size() const OVERRIDE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<unsigned char>& data() const { return data_; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<unsigned char>& data() { return data_; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RefCountedBytes();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<unsigned char> data_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RefCountedBytes);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An implementation of RefCountedMemory, where the bytes are stored in an STL
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string. Use this if your data naturally arrives in that format.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT RefCountedString : public RefCountedMemory {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefCountedString();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a RefCountedString object by performing a swap. (To non
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destructively build a RefCountedString, use the default constructor and
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // copy into object->data()).
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static RefCountedString* TakeString(std::string* to_destroy);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from RefCountedMemory:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const unsigned char* front() const OVERRIDE;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual size_t size() const OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& data() const { return data_; }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string& data() { return data_; }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RefCountedString();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RefCountedString);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// An implementation of RefCountedMemory that holds a chunk of memory
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// previously allocated with malloc or calloc, and that therefore must be freed
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// using free().
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class BASE_EXPORT RefCountedMallocedMemory : public base::RefCountedMemory {
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RefCountedMallocedMemory(void* data, size_t length);
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Overridden from RefCountedMemory:
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual const unsigned char* front() const OVERRIDE;
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual size_t size() const OVERRIDE;
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~RefCountedMallocedMemory();
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  unsigned char* data_;
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  size_t length_;
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RefCountedMallocedMemory);
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_MEMORY_REF_COUNTED_MEMORY_H_
147