#pragma once

#include <list>

/*!
 * ファイル名の一致判定を行うクラス。
 * ワイルドカードをサポートしています。
 */
class CNameMatcher
{
private:
	std::list<tstring> patterns_;

	bool ignoreCase_;

	bool hasWildcard_;

public:

	/*!
	 * パターンを指定して構築します。
	 * パターンはセミコロンで区切り複数のファイル名を指定できます。
	 * パターンには「*」と「?」のワイルドカードをサポートしています。
	 * ファイル名の前後の空白は取り除かれます。
	 * \param pattern パターン
	 * \param ignoreCase 大文字小文字を識別しない場合はtrue
	 */
	CNameMatcher(const tstring& pattern, const bool ignoreCase = true);

	/*!
	 * 指定したファイル名がパターンのいずれかのファイル名とマッチするか判定します。
	 * パターンが1つも指定されていない場合は常にfalseを返します。
	 * \param name ファイル名
	 * \return マッチする場合はtrue
	 */
	bool operator()(const tstring& name) const throw();

	/*!
	 * 有効なパターンが1つも指定されていないか?
	 * \return 有効なパターンが1つも指定されていなければtrue
	 */
	bool empty() const throw();

	/*!
	 * ワイルドカードを使用しているか?
	 * \return ワイルドカード(?,*)を使用している場合はtrue
	 */
	bool hasWildcard() const throw();

	/*!
	 * パターンの数
	 * \return パターンの数
	 */
	size_t size() const throw();

	/*!
	 * 指定したパターンを取得する.
	 * 範囲外を指定した場合の挙動は不定.
	 * \param idx インデックス
	 * \return パターン
	 */
	const tstring& operator[](size_t idx) const;

	/*!
	 * 有効なパターンのみを連結して文字列として返す.
	 * \return 有効なパターンのみの文字列
	 */
	tstring str() const;

};
