//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef SUPPORT_TEST_CONSTEXPR_CONTAINER_H
#define SUPPORT_TEST_CONSTEXPR_CONTAINER_H

// A dummy container with enough constexpr support to test the standard
// insert iterators, such as `back_insert_iterator`.

#include <algorithm>
#include <cassert>
#include <utility>

#include "test_macros.h"

#if TEST_STD_VER >= 14

template<class T, int N>
class ConstexprFixedCapacityDeque {
    T data_[N];
    int size_ = 0;
public:
    using value_type = T;
    using iterator = T *;
    using const_iterator = T const *;

    constexpr ConstexprFixedCapacityDeque() = default;
    constexpr iterator begin() { return data_; }
    constexpr iterator end() { return data_ + size_; }
    constexpr const_iterator begin() const { return data_; }
    constexpr const_iterator end() const { return data_ + size_; }
    constexpr size_t size() const { return size_; }
    constexpr const T& front() const { assert(size_ >= 1); return data_[0]; }
    constexpr const T& back() const { assert(size_ >= 1); return data_[size_-1]; }

    constexpr iterator insert(const_iterator pos, T t) {
        int i = static_cast<int>(pos - data_);
        if (i != size_) {
            std::move_backward(data_ + i, data_ + size_, data_ + size_ + 1);
        }
        data_[i] = std::move(t);
        size_ += 1;
        return data_ + i;
    }

    constexpr void push_back(T t) { insert(end(), std::move(t)); }
    constexpr void push_front(T t) { insert(begin(), std::move(t)); }
};

#endif // TEST_STD_VER >= 14

#endif // SUPPORT_TEST_CONSTEXPR_CONTAINER_H
