| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <stdint.h> |
| |
| #include <fbl/intrusive_double_list.h> |
| #include <fbl/unique_ptr.h> |
| |
| namespace devmgr { |
| |
| struct Metadata { |
| fbl::DoublyLinkedListNodeState<fbl::unique_ptr<Metadata>> node; |
| struct Node { |
| static fbl::DoublyLinkedListNodeState<fbl::unique_ptr<Metadata>>& node_state( |
| Metadata& obj) { |
| return obj.node; |
| } |
| }; |
| |
| uint32_t type; |
| uint32_t length; |
| bool has_path; // zero terminated string starts at data[length] |
| |
| char* Data() { |
| return reinterpret_cast<char*>(this + 1); |
| } |
| |
| const char* Data() const { |
| return reinterpret_cast<const char*>(this + 1); |
| } |
| |
| static zx_status_t Create(size_t data_len, fbl::unique_ptr<Metadata>* out) { |
| uint8_t* buf = new uint8_t[sizeof(Metadata) + data_len]; |
| if (!buf) { |
| return ZX_ERR_NO_MEMORY; |
| } |
| new (buf) Metadata(); |
| |
| out->reset(reinterpret_cast<Metadata*>(buf)); |
| return ZX_OK; |
| } |
| |
| // Implement a custom delete to deal with the allocation mechanism used in |
| // Create(). Since the ctor is private, all Metadata* will come from |
| // Create(). |
| void operator delete(void* ptr) { |
| delete [] reinterpret_cast<uint8_t*>(ptr); |
| } |
| |
| private: |
| Metadata() = default; |
| |
| Metadata(const Metadata&) = delete; |
| Metadata& operator=(const Metadata&) = delete; |
| |
| Metadata(Metadata&&) = delete; |
| Metadata& operator=(Metadata&&) = delete; |
| }; |
| |
| } // namespace devmgr |