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)#include "base/memory/ref_counted_memory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <stdlib.h> 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RefCountedMemory::Equals( 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<RefCountedMemory>& other) const { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return other.get() && 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size() == other->size() && 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (memcmp(front(), other->front(), size()) == 0); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedMemory::RefCountedMemory() {} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedMemory::~RefCountedMemory() {} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char* RefCountedStaticMemory::front() const { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t RefCountedStaticMemory::size() const { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return length_; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedStaticMemory::~RefCountedStaticMemory() {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedBytes::RefCountedBytes() {} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedBytes::RefCountedBytes(const std::vector<unsigned char>& initializer) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : data_(initializer) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuRefCountedBytes::RefCountedBytes(const unsigned char* p, size_t size) 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : data_(p, p + size) {} 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedBytes* RefCountedBytes::TakeVector( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char>* to_destroy) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefCountedBytes* bytes = new RefCountedBytes; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes->data_.swap(*to_destroy); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bytes; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char* RefCountedBytes::front() const { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STL will assert if we do front() on an empty vector, but calling code 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expects a NULL. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size() ? &data_.front() : NULL; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t RefCountedBytes::size() const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_.size(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedBytes::~RefCountedBytes() {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedString::RefCountedString() {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedString::~RefCountedString() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RefCountedString* RefCountedString::TakeString(std::string* to_destroy) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefCountedString* self = new RefCountedString; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_destroy->swap(self->data_); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char* RefCountedString::front() const { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_.empty() ? NULL : 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const unsigned char*>(data_.data()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t RefCountedString::size() const { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_.size(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RefCountedMallocedMemory::RefCountedMallocedMemory( 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* data, size_t length) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : data_(reinterpret_cast<unsigned char*>(data)), length_(length) { 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(data || length == 0); 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const unsigned char* RefCountedMallocedMemory::front() const { 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return length_ ? data_ : NULL; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)size_t RefCountedMallocedMemory::size() const { 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return length_; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RefCountedMallocedMemory::~RefCountedMallocedMemory() { 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) free(data_); 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 101