blob: c91e5ec9834381aa44967b2263e17b07d7f18d7f [file] [log] [blame]
// 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