// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef REMOTING_BASE_TYPED_BUFFER_H_ #define REMOTING_BASE_TYPED_BUFFER_H_ #include #include #include #include "base/memory/raw_ptr.h" namespace remoting { // A scoper for a variable-length structure such as SID, SECURITY_DESCRIPTOR and // similar. These structures typically consist of a header followed by variable- // length data, so the size may not match sizeof(T). The class supports // move-only semantics and typed buffer getters. template class TypedBuffer { public: TypedBuffer() : TypedBuffer(0) {} // Creates an instance of the object allocating a buffer of the given size. explicit TypedBuffer(uint32_t length) : buffer_(nullptr), length_(length) { if (length_ > 0) buffer_ = reinterpret_cast(new uint8_t[length_]); } TypedBuffer(TypedBuffer&& rvalue) : TypedBuffer() { Swap(rvalue); } TypedBuffer(const TypedBuffer&) = delete; TypedBuffer& operator=(const TypedBuffer&) = delete; ~TypedBuffer() { if (buffer_) { delete[] reinterpret_cast(buffer_.get()); buffer_ = nullptr; } } TypedBuffer& operator=(TypedBuffer&& rvalue) { Swap(rvalue); return *this; } // Accessors to get the owned buffer. // operator* and operator-> will assert() if there is no current buffer. T& operator*() const { assert(buffer_); return *buffer_; } T* operator->() const { assert(buffer_); return buffer_; } T* get() const { return buffer_; } uint32_t length() const { return length_; } // Helper returning a pointer to the structure starting at a specified byte // offset. T* GetAtOffset(uint32_t offset) { return reinterpret_cast(reinterpret_cast(buffer_.get()) + offset); } // Allow TypedBuffer to be used in boolean expressions. explicit operator bool() const { return buffer_ != nullptr; } // Swap two buffers. void Swap(TypedBuffer& other) { std::swap(buffer_, other.buffer_); std::swap(length_, other.length_); } private: // Points to the owned buffer. raw_ptr buffer_; // Length of the owned buffer in bytes. uint32_t length_; }; } // namespace remoting #endif // REMOTING_BASE_TYPED_BUFFER_H_