1 // Copyright (c) 2012 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 #include "base/memory/ref_counted_memory.h"
6
7 #include <utility>
8
9 #include "base/logging.h"
10 #include "base/memory/read_only_shared_memory_region.h"
11
12 namespace base {
13
Equals(const scoped_refptr<RefCountedMemory> & other) const14 bool RefCountedMemory::Equals(
15 const scoped_refptr<RefCountedMemory>& other) const {
16 return other.get() &&
17 size() == other->size() &&
18 (memcmp(front(), other->front(), size()) == 0);
19 }
20
21 RefCountedMemory::RefCountedMemory() = default;
22
23 RefCountedMemory::~RefCountedMemory() = default;
24
front() const25 const unsigned char* RefCountedStaticMemory::front() const {
26 return data_;
27 }
28
size() const29 size_t RefCountedStaticMemory::size() const {
30 return length_;
31 }
32
33 RefCountedStaticMemory::~RefCountedStaticMemory() = default;
34
35 RefCountedBytes::RefCountedBytes() = default;
36
RefCountedBytes(const std::vector<unsigned char> & initializer)37 RefCountedBytes::RefCountedBytes(const std::vector<unsigned char>& initializer)
38 : data_(initializer) {
39 }
40
RefCountedBytes(const unsigned char * p,size_t size)41 RefCountedBytes::RefCountedBytes(const unsigned char* p, size_t size)
42 : data_(p, p + size) {}
43
RefCountedBytes(size_t size)44 RefCountedBytes::RefCountedBytes(size_t size) : data_(size, 0) {}
45
TakeVector(std::vector<unsigned char> * to_destroy)46 scoped_refptr<RefCountedBytes> RefCountedBytes::TakeVector(
47 std::vector<unsigned char>* to_destroy) {
48 auto bytes = MakeRefCounted<RefCountedBytes>();
49 bytes->data_.swap(*to_destroy);
50 return bytes;
51 }
52
front() const53 const unsigned char* RefCountedBytes::front() const {
54 // STL will assert if we do front() on an empty vector, but calling code
55 // expects a NULL.
56 return size() ? &data_.front() : nullptr;
57 }
58
size() const59 size_t RefCountedBytes::size() const {
60 return data_.size();
61 }
62
63 RefCountedBytes::~RefCountedBytes() = default;
64
65 RefCountedString::RefCountedString() = default;
66
67 RefCountedString::~RefCountedString() = default;
68
69 // static
TakeString(std::string * to_destroy)70 scoped_refptr<RefCountedString> RefCountedString::TakeString(
71 std::string* to_destroy) {
72 auto self = MakeRefCounted<RefCountedString>();
73 to_destroy->swap(self->data_);
74 return self;
75 }
76
front() const77 const unsigned char* RefCountedString::front() const {
78 return data_.empty() ? nullptr
79 : reinterpret_cast<const unsigned char*>(data_.data());
80 }
81
size() const82 size_t RefCountedString::size() const {
83 return data_.size();
84 }
85
RefCountedSharedMemory(std::unique_ptr<SharedMemory> shm,size_t size)86 RefCountedSharedMemory::RefCountedSharedMemory(
87 std::unique_ptr<SharedMemory> shm,
88 size_t size)
89 : shm_(std::move(shm)), size_(size) {
90 DCHECK(shm_);
91 DCHECK(shm_->memory());
92 DCHECK_GT(size_, 0U);
93 DCHECK_LE(size_, shm_->mapped_size());
94 }
95
96 RefCountedSharedMemory::~RefCountedSharedMemory() = default;
97
front() const98 const unsigned char* RefCountedSharedMemory::front() const {
99 return static_cast<const unsigned char*>(shm_->memory());
100 }
101
size() const102 size_t RefCountedSharedMemory::size() const {
103 return size_;
104 }
105
RefCountedSharedMemoryMapping(ReadOnlySharedMemoryMapping mapping)106 RefCountedSharedMemoryMapping::RefCountedSharedMemoryMapping(
107 ReadOnlySharedMemoryMapping mapping)
108 : mapping_(std::move(mapping)), size_(mapping_.size()) {
109 DCHECK_GT(size_, 0U);
110 }
111
112 RefCountedSharedMemoryMapping::~RefCountedSharedMemoryMapping() = default;
113
front() const114 const unsigned char* RefCountedSharedMemoryMapping::front() const {
115 return static_cast<const unsigned char*>(mapping_.memory());
116 }
117
size() const118 size_t RefCountedSharedMemoryMapping::size() const {
119 return size_;
120 }
121
122 // static
123 scoped_refptr<RefCountedSharedMemoryMapping>
CreateFromWholeRegion(const ReadOnlySharedMemoryRegion & region)124 RefCountedSharedMemoryMapping::CreateFromWholeRegion(
125 const ReadOnlySharedMemoryRegion& region) {
126 ReadOnlySharedMemoryMapping mapping = region.Map();
127 if (!mapping.IsValid())
128 return nullptr;
129 return MakeRefCounted<RefCountedSharedMemoryMapping>(std::move(mapping));
130 }
131
132 } // namespace base
133