/**
 * 最初の著者:: トゥイー
 * リポジトリ情報:: $Id: RelationController.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_RELEASE_POLICY_HPP_
#define _UTILITY_RELEASE_POLICY_HPP_

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

namespace Utility {

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

	/**
	 * 密関連の有効期間を制御する密関連制御インターフェイスです。
	 * このインターフェイスは、
	 * 一つの密コンテナ要素が持つ全ての密関連の有効期間を制御するためのものです。
	 * 密関連制御の実装者は、
	 * このインターフェイスを使用して密関連の有効期間に合わせた密関連制御クラスを実装する必要があります。
	 * 
	 * 密関連制御クラスは、addRelation および release メソッドが呼び出されるタイミングで
	 * 制御対象密コンテナ要素の密関連を制御します。
	 * isOwned メソッドは、密関連が行われているかどうかの問い合わせを行うためのメソッドです。
	 * 密関連制御クラスの実装者は、これら全てのメソッドを適切に実装する必要があります。
	 *
	 * @author トゥイー
	 */
	class RelationController : public boost::noncopyable {
	public:
		/**
		 * 密関連しているかどうかを判断します。
		 *
		 * @return 密関連している場合は true、それ以外の場合は false。
		 */
		virtual bool isOwned() const = 0;

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

		/**
		 * 密関連を解放します。密関連していない場合は何もしません。
		 * このメソッドは、密コンテナ要素が全ての密関連を解放するときに呼び出されます。
		 */
		virtual void release() = 0;

		/**
		 * 対象密コンテナを指定して密関連を解放します。
		 * 対象密コンテナと密関連していない場合は何もしません。
		 * このメソッドは、密コンテナ要素が特定の密コンテナと密関連を解放するときに呼び出されます。
		 *
		 * @param from 密コンテナ。
		 */
		virtual void release(CloseContainer& from) = 0;

		/**
		 * 密関連を追加します。
		 * このメソッドは、密コンテナ要素が密コンテナ要素と密関連するときに呼び出されます。
		 *
		 * @param relation 密関連。
		 */
		virtual void addRelation(const CloseRelationPtr& relation) = 0;
	};

}  // namespace Utility

#endif
