/**
 * 最初の著者:: トゥイー
 * リポジトリ情報:: $Id: Phrase.hpp 64 2011-05-21 01:55:09Z yutaka_at_home $
 * 著作権:: Copyright (C) Ownway.info, 2011. All rights reserved.
 * ライセンス:: CPL(Common Public Licence)
 */

#ifndef _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_HPP_
#define _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_HPP_

#include <atlbase.h>
#include <sphelper.h>

#include <iostream>
#include <string>
#include <vector>

#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>

namespace spcf {

	class GrammarPhrase;
	typedef boost::shared_ptr<GrammarPhrase> GrammarPhrasePtr;

	class PhraseProperty;
	typedef boost::shared_ptr<PhraseProperty> PhrasePropertyPtr;

	class Phrase_i;

	/**
	 * フレーズです。
	 */
	class Phrase : public boost::noncopyable {
	private:
		Phrase_i* impl;

	public:
		/**
		 * フレーズを構築します。
		 */
		Phrase(const GrammarPhrasePtr& phrase);

		/**
		 * フレーズを破棄します。
		 */
		~Phrase();

	public:
		/**
		 * フレーズを取得します。
		 */
		const std::string& getPhrase() const;

		/**
		 * プロパティを取得します。
		 */
		const PhrasePropertyPtr& getProperty() const;

	public:
		/**
		 * このフレーズによる状態遷移を文法に追加します。
		 *
		 * @param grammar 文法を指定します。
		 * @param fromState 状態遷移の基点となる状態を指定します。
		 * @param toState 遷移先となる状態を指定します。
		 */
		HRESULT addTransition(const CComPtr<ISpRecoGrammar>& grammar,
		                      SPSTATEHANDLE fromState, SPSTATEHANDLE toState = (SPSTATEHANDLE) 0) const;
	};

}  // namespace spcf

#endif
