/*---------------------------------------------------------------------------* Project: Horizon File: os_HandleObject.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 20014 $ *---------------------------------------------------------------------------*/ /*! @file @brief Handle に関するAPI の宣言 :include nn/os.h */ #ifndef NN_OS_OS_HANDLEOBJECT_H_ #define NN_OS_OS_HANDLEOBJECT_H_ #include #include #include #include #include #ifdef __cplusplus namespace nn { namespace os { class HandleManager; /*! @brief OS が管理するオブジェクトを表す抽象基底クラスです。 実際のオブジェクトの生成は、継承されたクラスのコンストラクタか、 クラス固有の初期化関数によって行われます。 オブジェクトを破棄するには、継承されたクラス固有の破棄関数を呼びます。 明示的に破棄関数が呼ばれなかった場合は、多くのクラスではデストラクタによって自動的に破棄されます。 このクラスを直接インスタンス化することはできません。 */ class HandleObject : private nn::util::NonCopyable { public: /*! @brief ハンドルを取得します。 @return ハンドルを返します。 */ nn::Handle GetHandle() const { return m_Handle; } /*! @brief オブジェクトが有効かどうかを返します。 @return オブジェクトが有効ならtrue、無効ならfalseを返します。 */ bool IsValid() const { return m_Handle.IsValid(); } protected: /*! @brief コンストラクタです。 ハンドルオブジェクトを構築します。 */ HandleObject() {} /*! @brief デストラクタです。 内部で @ref Close を呼びます。 */ ~HandleObject(); /*! @brief ハンドルをセットします。 @param[in] handle ハンドルを指定します。 @return 無し。 */ void SetHandle(nn::Handle handle); /*! @brief ハンドルを閉じます。 @return 無し。 */ void Close(); void Finalize(); void ClearHandle(); private: nn::Handle m_Handle; friend class HandleManager; }; // インライン実装 inline void HandleObject::Close() { if (IsValid()) { nn::svc::CloseHandle(m_Handle); m_Handle = Handle(); } } inline HandleObject::~HandleObject() { Close(); } inline void HandleObject::Finalize() { Close(); } inline void HandleObject::SetHandle(nn::Handle handle) { NN_TASSERTMSG_(!IsValid(), "current handle(=%08X) is active\n", m_Handle.GetPrintableBits()); NN_TASSERT_(handle.IsValid()); m_Handle = handle; } inline void HandleObject::ClearHandle() { m_Handle = Handle(); } } // end of namespace os } // end of namespace nn #endif // __cplusplus #endif // ifndef NN_OS_OS_HANDLEOBJECT_H_