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

#ifndef _UTILITY_CLOSE_RELATION_HPP_
#define _UTILITY_CLOSE_RELATION_HPP_

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

namespace Utility {

	class CloseContainer;

	class CloseRelation;
	typedef boost::shared_ptr<CloseRelation> CloseRelationPtr;

	/**
	 * 密コンテナと密コンテナ要素の関連を表す密関連インターフェイスです。
	 * このインターフェイスは、密コンテナ内部使用するためのものです。
	 * 密コンテナの使用者は、このインターフェイスの存在を知る必要はありません。
	 * 密コンテナの実装者は、
	 * このインターフェイスを使用してコンテナの種類に合わせた密関連クラスを実装する必要があります。
	 * 密コンテナの実装者は、
	 * 密関連の実装候補として CloseRelationImpl テンプレートを使用することも検討してみてください。
	 * 
	 * @see CloseRelationImpl
	 *
	 * @author トゥイー
	 */
	class CloseRelation : public boost::noncopyable {
	public:
		/**
		 * 所属する密コンテナを取得します。
		 *
		 * @return 密関連している場合は所属する密コンテナ、それ以外の場合は NULL。
		 */
		virtual CloseContainer* getOwner() = 0;

		/**
		 * 密関連しているかどうかを判断します。
		 *
		 * @return 密関連している場合は true、それ以外の場合は false。
		 */
		virtual bool isOwned() const = 0;

		/**
		 * 対象密コンテナを指定して、密関連しているかどうかを判断します。
		 *
		 * @param owner 密コンテナ。
		 * @return 対象密コンテナと密関連している場合は true、それ以外の場合は false。
		 */
		virtual bool isOwned(CloseContainer& owner) const = 0;

		/**
		 * 密関連を解放します。密関連していない場合は何もしません。
		 */
		virtual void release() = 0;
	};

}  // namespace Utility

#endif
