/*
	Copyright 2016, 2017 Michele "King_DuckZ" Santullo

	This file is part of MyCurry.

	MyCurry is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	MyCurry is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with MyCurry.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "vector.hpp"
#include "constrained_value.hpp"
#include <boost/algorithm/clamp.hpp>

namespace curry {
	namespace implem {
		template <typename T, std::size_t... I>
		inline
		vwr::Vec<T> clamp_vector_components (const vwr::Vec<T>& parMin, const vwr::Vec<T>& parMax, const vwr::Vec<T>& parValue, vwr::bt::index_seq<I...>) {
			return vwr::Vec<T>(boost::algorithm::clamp(parValue[I], parMin[I], parMax[I])...);
		}
	} //namespace implem

	template <typename T>
	class VectorConstrainer;

	template <typename T>
	class VectorConstrainer<vwr::Vec<T>> {
	public:
		vwr::Vec<T> operator() (const vwr::Vec<T>& parMin, const vwr::Vec<T>& parMax, const vwr::Vec<T>& parValue) {
			return implem::clamp_vector_components(parMin, parMax, parValue, vwr::bt::index_range<0, vwr::Vec<T>::dimensions>());
		}
	};

	template <typename T>
	using ConstrainedPosition = ConstrainedValue<T, VectorConstrainer<T>>;
} //namespace curry
