// 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
