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