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

#ifndef _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_PROPETY_HPP_
#define _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_PROPETY_HPP_

#include <sphelper.h>

#include <string>

namespace spcf {

	/**
	 * プロパティです。
	 */
	class PhraseProperty {
	private:
		std::string name_;
		bool hasVal_;
		long val_;
		bool hasValStr_;
		std::string valstr_;

	public:
		/**
		 * プロパティを構築します。
		 */
		PhraseProperty() : name_(""), hasVal_(false), hasValStr_(false) {
		}

		/**
		 * プロパティを構築します。
		 */
		PhraseProperty(const SPPHRASEPROPERTY* property);

		/**
		 * プロパティを構築します。
		 */
		PhraseProperty(const std::string& name) :
		name_(name), hasVal_(false), hasValStr_(false) {
		}

		/**
		 * プロパティを構築します。
		 */
		PhraseProperty(const std::string& name, long val) :
		name_(name), hasVal_(true), val_(val), hasValStr_(false) {
		}

		/**
		 * プロパティを構築します。
		 */
		PhraseProperty(const std::string& name, const std::string& valstr) :
		name_(name), hasVal_(false), hasValStr_(true), valstr_(valstr) {
		}

		/**
		 * プロパティを構築します。
		 */
		PhraseProperty(const std::string& name, long val, const std::string& valstr) :
		name_(name), hasVal_(true), val_(val), hasValStr_(true), valstr_(valstr) {
		}

	public:
		/**
		 * プロパティが有効かどうかを判断します。
		 */
		operator bool() const {
			return !name_.empty();
		}

		/**
		 * プロパティが無効かどうかを判断します。
		 */
		bool operator!() const {
			return name_.empty();
		}

	public:
		/**
		 * 名前を取得します。
		 */
		const std::string& getName() const {
			return name_;
		}

		/**
		 * VALによって値が指定されているかどうかを判断します。
		 */
		bool hasVal() const {
			return hasVal_;
		}

		/**
		 * VALによって指定した値を取得します。
		 */
		long getVal() const {
			return val_;
		}

		/**
		 * VALSTRによって文字列が指定されているかどうかを判断します。
		 */
		bool hasValStr() const {
			return hasValStr_;
		}

		/**
		 * VALSTRに指定した文字列を取得します。
		 */
		const std::string& getValStr() const {
			return valstr_;
		}
	};

}  // namespace spcf

#endif
