namespace gintenlib
{
- template< typename Derived, typename T, typename Category = Derived >
- struct pointer_facade
- : bool_comparable< pointer_facade< Derived, T, Category > >
+ namespace pointer_facade_ // ADL 回避
{
- // スマートポインタとして必要なあれこれ
- typedef T element_type;
- typedef T value_type;
- typedef T* pointer;
- // reference は void 型への対応のため特殊
- typedef typename boost::add_reference<T>::type reference;
-
- // 参照外しとポインタ取得
- reference operator*() const
+ // スマートポインタ生成ファクトリ
+ template< typename Derived, typename T, typename Category = Derived >
+ struct pointer_facade
+ : bool_comparable< pointer_facade< Derived, T, Category > >
{
- using namespace std;
- assert( get_() != 0 );
- return *get_();
- }
- pointer operator->() const
+ // スマートポインタとして必要な typedef
+ typedef T element_type;
+ typedef T value_type;
+ typedef T* pointer;
+ // reference は void 型への対応のため特殊
+ typedef typename boost::add_reference<T>::type reference;
+
+ // 参照外しとポインタ取得
+ reference operator*() const
+ {
+ using namespace std;
+ assert( get_() != 0 );
+ return *get_();
+ }
+ pointer operator->() const
+ {
+ using namespace std;
+ assert( get_() != 0 );
+ return get_();
+ }
+ // for boost::mem_fn
+ friend pointer get_pointer( const Derived& target )
+ {
+ return target.get();
+ }
+
+ // bool との比較
+ bool operator!() const
+ {
+ return !get_();
+ }
+ // operator safe_bool は bool_comparable の管轄
+
+ // 相互比較は外部で定義する
+
+ private:
+ // 派生クラスの get() を呼び出す
+ pointer get_() const
+ {
+ return static_cast<const Derived*>(this)->get();
+ }
+
+ protected:
+ pointer_facade(){}
+ ~pointer_facade(){}
+
+ }; // pointer_facade<Derived, T, Category>
+
+ // 相互比較
+ // カテゴリが同じものなら相互比較OK
+ template<typename T, typename U, typename D1, typename D2, typename C>
+ inline bool operator==( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
{
- using namespace std;
- assert( get_() != 0 );
- return get_();
+ return static_cast<const D1&>(lhs).get() == static_cast<const D2&>(rhs).get();
}
- // for boost::mem_fn
- friend pointer get_pointer( const Derived& target )
+ template<typename T, typename U, typename D1, typename D2, typename C>
+ inline bool operator!=( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
{
- return target.get();
+ return static_cast<const D1&>(lhs).get() != static_cast<const D2&>(rhs).get();
}
- // bool との比較
- bool operator!() const
+ // < は、ポインタ型が同じ場合とそうでない場合で分ける
+ template<typename T, typename D, typename C>
+ inline bool operator< ( const pointer_facade<D, T, C>& lhs, const pointer_facade<D, T, C>& rhs )
{
- return !get_();
+ // 同じポインタの比較は std::less で比較する
+ return std::less<T*>()( static_cast<const D&>(lhs).get(), static_cast<const D&>(rhs).get() );
}
- // operator safe_bool は bool_comparable の管轄
-
- // 相互比較は外部で定義する
-
- private:
- // 派生クラスの get() を呼び出す
- pointer get_() const
+ template<typename T, typename U, typename D1, typename D2, typename C>
+ inline bool operator< ( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
{
- return static_cast<const Derived*>(this)->get();
+ // 異なるポインタ同士の比較は、仕方ないので < で比較する
+ return static_cast<const D1&>(lhs).get() < static_cast<const D2&>(rhs).get();
}
-
- protected:
- pointer_facade(){}
- ~pointer_facade(){}
- }; // pointer_facade<Derived, T, Category>
+ } // namespace pointer_facade_
- // 相互比較
- // カテゴリが同じものなら相互比較OK
- template<typename T, typename U, typename D1, typename D2, typename C>
- inline bool operator==( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
- {
- return static_cast<const D1&>(lhs).get() == static_cast<const D2&>(rhs).get();
- }
- template<typename T, typename U, typename D1, typename D2, typename C>
- inline bool operator!=( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
- {
- return static_cast<const D1&>(lhs).get() != static_cast<const D2&>(rhs).get();
- }
-
- // < は、ポインタ型が同じ場合とそうでない場合で分ける
- template<typename T, typename D, typename C>
- inline bool operator< ( const pointer_facade<D, T, C>& lhs, const pointer_facade<D, T, C>& rhs )
- {
- // 同じポインタの比較は std::less で比較する
- return std::less<T*>()( static_cast<const D&>(lhs).get(), static_cast<const D&>(rhs).get() );
- }
- template<typename T, typename U, typename D1, typename D2, typename C>
- inline bool operator< ( const pointer_facade<D1, T, C>& lhs, const pointer_facade<D2, U, C>& rhs )
- {
- // 異なるポインタ同士の比較は、仕方ないので < で比較する
- return static_cast<const D1&>(lhs).get() < static_cast<const D2&>(rhs).get();
- }
+ // 名前空間に引き入れる
+ using namespace pointer_facade_;
} // namespace gintenlib