#ifndef _VKTCONSTEXPRVECTORUTIL_HPP
#define _VKTCONSTEXPRVECTORUTIL_HPP
/*------------------------------------------------------------------------
 * Vulkan CTS Framework
 * ------------------------
 *
 * Copyright (c) 2020 The Khronos Group Inc.
 * Copyright (c) 2020 Advanced Micro Devices, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
/*!
 * \file
 * \brief Compile time friendly dynamic sized array with maximum capacity
 */
/*--------------------------------------------------------------------*/

#include <cstddef>
#include <array>

namespace vkt
{
/*--------------------------------------------------------------------*//*!
 * \brief Constexpr compatable vector with checked maximum capacity
 *
 * \note Unlike std::array, size() and max_size() are different values
 *       This makes behaviour more similar to that of std::vector.
 *//*--------------------------------------------------------------------*/
template<typename _t, size_t CAPACITY>
class ConstexprVector
{
public:
	using value_type = _t;
	using size_type = ::std::size_t;
	using difference_type = ::std::ptrdiff_t;
	using const_reference = const value_type&;
	using const_pointer = const value_type*;
	using const_iterator = const value_type*;

	inline constexpr ConstexprVector() noexcept : values{}, count{0} {}

	/*--------------------------------------------------------------------*//*!
	 * MSVC v140 chokes on this if it is a raw variadic template list.
	 * By providing a single argument lead for type deduction it seems to fix
	 * things. Marking constructor as explicit since this effectively becomes
	 * a single argument constructor.
	 *//*--------------------------------------------------------------------*/
	template<typename _arg_t, typename... _args_t>
	inline constexpr explicit ConstexprVector(const _arg_t& arg1, const _args_t&... args) noexcept :
		values{arg1, args...},
		count{sizeof...(_args_t) + 1}
	{
		static_assert((sizeof...(_args_t) + 1) <= CAPACITY, "Not enough capacity to store values");
	}

	inline constexpr const_reference at(size_type pos) const noexcept { return values[pos]; }
	inline constexpr const_reference operator[](size_type pos) const noexcept { return values[pos]; }
	inline constexpr const_reference front() const noexcept { return values[0]; }
	inline constexpr const_reference back() const noexcept { return values[count - 1];	}
	inline constexpr const_pointer data() const noexcept { return values; }
	inline constexpr const_iterator begin() const noexcept { return &values[0]; }
	inline constexpr const_iterator cbegin() const noexcept { return &values[0]; }
	inline constexpr const_iterator end() const noexcept { return &values[count]; }
	inline constexpr const_iterator cend() const noexcept { return &values[count]; }
	inline constexpr bool empty() const noexcept { return count == 0; }
	inline constexpr size_type size() const noexcept { return count; }
	inline constexpr size_type max_size() const noexcept { return CAPACITY; }

private:
	value_type values[CAPACITY];
	size_type count;
};

} // namespace vkt

#endif // _VKTCONSTEXPRVECTORUTIL_HPP
