/*! @file @brief 連結リストによる共有配列ポインタ - @ref _linked_array @author %Juna */ #ifndef Juna_LinkedList_SharedArray_Hpp #define Juna_LinkedList_SharedArray_Hpp #include "linked_ptr.hpp" namespace Juna { //! @defgroup _linked_array //@{ //! (双方向)連結リストによる共有配列ポインタクラステンプレート template, class Linker = linked_ptr_default::doubly> class linked_array { protected: typedef linked_ptr LinkedPtr; typedef T& reference; typedef T* pointer; public: //! デフォルトコンストラクタ linked_array(Deleter d = Deleter()) : Pointer(d) {} //! ポインタによるコンストラクタ explicit linked_array(pointer p,Deleter d = Deleter()) : Pointer(p,d) {} //! コピーコンストラクタ linked_array(const linked_array &src) : Pointer(src.Pointer) {} //! デストラクタ ~linked_array() {} //! @name reset //@{ //! 解放 void reset(void) {Pointer.reset();} //! 新しいポインタの代入 void reset(pointer p,Deleter d = Deleter()) {Pointer.reset(p,d);} //@} //! @name 参照 //@{ //! 直接参照 pointer get(void) const {return Pointer.get();} //! []演算子 reference operator[](unsigned index) const {return Pointer.get()[index];} //@} //! 代入演算子 linked_array &operator=(const linked_array &rhs) {Pointer = rhs.Pointer;return *this;} //! @name bool //@{ //! bool typedef typename LinkedPtr::unspecified_bool_type unspecified_bool_type; operator unspecified_bool_type(void) const {return Pointer.operator unspecified_bool_type();} //! 単項!演算子 bool operator!(void) const {return Pointer.operator!();} //@} //! @name 比較 //@{ //! ==演算子 bool operator==(const linked_array &rhs) const {return Pointer == rhs.Pointer;} //! !=演算子 bool operator!=(const linked_array &rhs) const {return Pointer != rhs.Pointer;} //@} //! @name 共有参照数 //@{ //! 参照数 /*! @return 自身の参照も含めた参照数(Nullへの参照時も1を返す) */ long use_count(void) const {return Pointer.use_count();} //! 共有していないか /*! @retval true 共有していない @retval false 共有している */ bool unique(void) const {return Pointer.unique();} //@} //! @name 実装インターフェイス //@{ //! 削除子 const Deleter &deleter(void) const {return Pointer;} //! 削除子 Deleter &deleter(void) {return Pointer;} //! 接続子 const Linker &linker(void) const {return Pointer;} //! 接続子 Linker &linker(void) {return Pointer;} //@} private: LinkedPtr Pointer; }; //! 単方向連結リストによる共有配列ポインタクラステンプレート template > class slinked_array : public linked_array { typedef linked_array base_class; public: //! デフォルトコンストラクタ slinked_array(Deleter d = Deleter()) : base_class(d) {} //! ポインタによるコンストラクタ explicit slinked_array(pointer p,Deleter d = Deleter()) : base_class(p,d) {} //! コピーコンストラクタ slinked_array(const slinked_array &src) : base_class(src) {} //! 代入演算子 slinked_array &operator=(const slinked_array &rhs) {base_class::operator=(rhs);return *this;} }; //@} }//namespace Juna #endif