OSDN Git Service

pointer_facade に ADL 対策をした
authorSubaruG <subaru_g@users.sourceforge.jp>
Thu, 28 Jan 2010 17:59:57 +0000 (02:59 +0900)
committerSubaruG <subaru_g@users.sourceforge.jp>
Thu, 28 Jan 2010 17:59:57 +0000 (02:59 +0900)
gintenlib/pointer_facade.hpp

index 186efcb..f1806bc 100644 (file)
 
 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