/*
*************************************************************************************************

stlのコンテナの補助機能

*************************************************************************************************
*/

#pragma once


#include <vector>
#include <algorithm>
#include <functional>



namespace util
{


//! 指定コンテナの余剰バッファを最小限に切り詰める
template<typename T>
void shrink_to_fit( std::vector<T>& v )
{
	std::vector<T>(v).swap(v);
}

//! 指定コンテナを空にして余剰バッファも最小化する
template<typename T>
void clear_and_minimize( std::vector<T>& v )
{
	std::vector<T>().swap(v);
}


//! コンテナのdst_containerのendに, コンテナadd_containerの全要素を追加する
//! @param[out] dst_container - 追加先コンテナ
//! @param[in]  src_container - 追加するコンテナ
template<typename DstContainerType , typename AddContainerType>
void insert_to_end( DstContainerType& dst_container , AddContainerType& add_container )
{
	DstContainerType::iterator dst_end   = dst_container.end();
	AddContainerType::iterator add_begin = add_container.begin();
	AddContainerType::iterator add_end   = add_container.end();

	dst_container.insert( dst_end , add_begin , add_end );
}


//! vectorの重複要素除去
template<typename T> void vector_unique(std::vector<T>& cont)
{
	std::sort( cont.begin(), cont.end() );
	cont.erase( std::unique( cont.begin(), cont.end() ), cont.end() );
}


}



#define PERMUTATION_FOR(CONTAINER) \
std::sort((CONTAINER).begin(), (CONTAINER).end()); \
for ( \
	bool ON_PERMUTATION_FOR = true; \
	ON_PERMUTATION_FOR; \
	ON_PERMUTATION_FOR = std::next_permutation((CONTAINER).begin(), (CONTAINER).end()))
