// Copyright 2016 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 <fbl/alloc_checker.h>
#include <fbl/macros.h>
#include <new>
#include <stddef.h>
#include <zircon/assert.h>

namespace fbl {

// Runtime-determined, fixed size arrays that are "inlined" (e.g., on the stack) if the size at most
// |max_inline_count| or heap-allocated otherwise. This is typically used like:
//
//   fbl::AllocChecker ac;
//   fbl::InlineArray<zx_handle_t, 4u> handle_values(&ac, num_handles);
//   if (!ac.check())
//       return ZX_ERR_NO_MEMORY;
//
// Note: Currently, |max_inline_count| must be at least 1.
template <typename T, size_t max_inline_count>
class InlineArray {
public:
    InlineArray(fbl::AllocChecker* ac, size_t count)
        : count_(count),
          ptr_(!count_ ? nullptr
                       : is_inline() ? reinterpret_cast<T*>(inline_storage_) : new (ac) T[count_]) {
        if (is_inline()) {
            // Arm the AllocChecker even if we didn't allocate -- the user should check it
            // regardless!
            ac->arm(0u, true);
            for (size_t i = 0; i < count_; i++)
                new (&ptr_[i]) T();
        }
    }

    ~InlineArray() {
        if (is_inline()) {
            for (size_t i = 0; i < count_; i++)
                ptr_[i].~T();
        } else {
            delete[] ptr_;
        }
    }

    InlineArray() = delete;
    DISALLOW_COPY_ASSIGN_AND_MOVE(InlineArray);

    size_t size() const {
        return count_;
    }

    T* get() const { return ptr_; }

    T& operator[](size_t i) const {
        ZX_DEBUG_ASSERT(i < count_);
        return ptr_[i];
    }

private:
    bool is_inline() const { return count_ <= max_inline_count; }

    const size_t count_;
    T* const ptr_;
    alignas(T) char inline_storage_[max_inline_count * sizeof(T)];
};

} // namespace fbl
