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

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

namespace Utility {

	class CloseRelation;
	class RelationController;
	typedef boost::shared_ptr<RelationController> RelationControllerPtr;
	class RelationPolicy;

	/**
	 * 全ての密コンテナ要素のルートクラスです。
	 * 密コンテナと密関連する全ての密コンテナ要素は、このクラスを継承する必要があります。
	 *
	 * @author トゥイー
	 */
	class CloseContainerElement : public boost::noncopyable {
		friend class CloseContainer;

	private:
		RelationControllerPtr m_controller;

	public:
		/**
		 * 密コンテナ要素を構築します。
		 *
		 * @param controller 密関連コントローラ。null 不可。
		 */
		CloseContainerElement(const RelationControllerPtr& controller);

		/**
		 * 密コンテナ要素を構築します。
		 *
		 * @param policy 密関連ポリシー。
		 */
		CloseContainerElement(RelationPolicy& policy);

		/**
		 * 密コンテナ要素を破棄します。
		 */
		virtual ~CloseContainerElement();

	private:
		/**
		 * 密コンテナとの関連を追加します。
		 * このメソッドは、密コンテナからのみ呼び出されます。
		 *
		 * @param relation 密関連。null 不可。
		 */
		void addRelation(const boost::shared_ptr<CloseRelation>& relation);

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

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

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

		/**
		 * 対象密コンテナを指定して密関連を解放します。
		 * 対象密コンテナと密関連していない場合は何もしません。
		 *
		 * @param from 密コンテナ。
		 */
		void release(CloseContainer& from);
	};

}  // namespace Utility

#endif
