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