Index: third_party/smartany/shared_any.h |
diff --git a/third_party/smartany/shared_any.h b/third_party/smartany/shared_any.h |
deleted file mode 100644 |
index a6a42f494f9dd9657be7219defa55a11cd9093eb..0000000000000000000000000000000000000000 |
--- a/third_party/smartany/shared_any.h |
+++ /dev/null |
@@ -1,412 +0,0 @@ |
-//+--------------------------------------------------------------------------- |
-// |
-// Copyright ( C ) Microsoft, 2002. |
-// |
-// File: shared_any.h |
-// |
-// Contents: automatic resource management |
-// |
-// Classes: shared_any<> and various typedefs |
-// |
-// Functions: get |
-// reset |
-// valid |
-// |
-// Author: Eric Niebler ( ericne@microsoft.com ) |
-// |
-//---------------------------------------------------------------------------- |
- |
- |
-#ifndef SHARED_ANY |
-#define SHARED_ANY |
- |
-#include <cassert> |
-#include <functional> // for std::less |
-#include <algorithm> // for std::swap |
-#include "smart_any_fwd.h" |
- |
-namespace detail |
-{ |
- class ref_count_allocator |
- { |
- struct node; |
- node *m_list_blocks; |
- node *m_last_alloc; |
- node *m_last_free; |
- |
- ref_count_allocator(); |
- ~ref_count_allocator(); |
- public: |
- void finalize(); |
- long volatile *alloc(); |
- long volatile *alloc( long val ); |
- void free( long volatile *refcount ); |
- |
- static ref_count_allocator instance; |
- }; |
- |
- template<typename T,class close_policy,class invalid_value,int unique> |
- struct shared_any_helper; |
- |
- template<typename Super> |
- struct shared_holder : Super |
- { |
- explicit shared_holder( typename Super::type t ) |
- : Super( t ) |
- { |
- } |
- |
- shared_holder( shared_holder const & that ) |
- : Super( that ) |
- { |
- if( Super::valid() ) |
- { |
- Super::inc_ref(); |
- } |
- } |
- |
- ~shared_holder() |
- { |
- if( Super::valid() ) |
- { |
- Super::dec_ref(); |
- } |
- } |
- }; |
- |
- template<typename T,class invalid_value_type> |
- struct intrusive |
- { |
- typedef T type; |
- |
- explicit intrusive( T t ) |
- : m_t( t ) |
- { |
- } |
- |
- bool valid() const |
- { |
- return m_t != static_cast<T>( invalid_value_type() ); |
- } |
- |
- void inc_ref() |
- { |
- m_t->AddRef(); |
- } |
- |
- void dec_ref() |
- { |
- if( 0 == m_t->Release() ) |
- { |
- m_t = static_cast<T>( invalid_value_type() ); |
- } |
- } |
- |
- T m_t; |
- }; |
- |
- template<typename T,class close_policy,class invalid_value_type> |
- struct nonintrusive |
- { |
- typedef T type; |
- |
- explicit nonintrusive( T t ) |
- : m_t( t ), |
- m_ref( 0 ) |
- { |
- if( valid() ) |
- { |
- m_ref = ref_count_allocator::instance.alloc(1L); |
- if( ! m_ref ) |
- { |
- m_t = static_cast<T>( invalid_value_type() ); |
- throw std::bad_alloc(); |
- } |
- } |
- } |
- |
- bool valid() const |
- { |
- return m_t != static_cast<T>( invalid_value_type() ); |
- } |
- |
- void inc_ref() |
- { |
- ::InterlockedIncrement( m_ref ); |
- } |
- |
- void dec_ref() |
- { |
- if( 0L == ::InterlockedDecrement( m_ref ) ) |
- { |
- ref_count_allocator::instance.free( m_ref ); |
- m_ref = 0; |
- close_policy::close( m_t ); |
- m_t = static_cast<T>( invalid_value_type() ); |
- } |
- } |
- |
- typename holder<T>::type m_t; |
- long volatile *m_ref; |
- }; |
- |
- template<class close_policy> |
- struct is_close_release_com |
- { |
- static bool const value = false; |
- }; |
- template<> |
- struct is_close_release_com<close_release_com> |
- { |
- static bool const value = true; |
- }; |
- |
- // credit Rani Sharoni for showing me how to implement |
- // is_com_ptr on VC7. This is deeply magical code. |
- template<typename T> |
- struct is_com_ptr |
- { |
- private: |
- struct maybe |
- { |
- operator IUnknown*() const; |
- operator T(); |
- }; |
- |
- template<typename U> |
- static yes check(T, U); |
- static no check(IUnknown*, int); |
- static maybe get(); |
- public: |
- static bool const value = sizeof(check(get(),0)) == sizeof(yes); |
- }; |
- |
- template<> |
- struct is_com_ptr<IUnknown*> |
- { |
- static bool const value = true; |
- }; |
-} |
- |
-template<typename T,class close_policy,class invalid_value,int unique> |
-class shared_any |
-{ |
- typedef detail::safe_types<T,close_policy> safe_types; |
- |
- // disallow comparison of shared_any's |
- bool operator==( detail::safe_bool ) const; |
- bool operator!=( detail::safe_bool ) const; |
- |
-public: |
- typedef typename detail::holder<T>::type element_type; |
- typedef close_policy close_policy_type; |
- typedef typename safe_types::pointer_type pointer_type; |
- typedef typename safe_types::reference_type reference_type; |
- |
- // Fix-up the invalid_value type on older compilers |
- typedef typename detail::fixup_invalid_value<invalid_value>:: |
- template rebind<T>::type invalid_value_type; |
- |
- friend struct detail::shared_any_helper<T,close_policy,invalid_value,unique>; |
- |
- // default construct |
- shared_any() |
- : m_held( static_cast<T>( invalid_value_type() ) ) |
- { |
- } |
- |
- // construct from object. If we fail to allocate a reference count, |
- // then the T object is closed, and a bad_alloc exception is thrown. |
- explicit shared_any( T t ) |
- try : m_held( t ) |
- { |
- } |
- catch( std::bad_alloc & ) |
- { |
- close_policy::close( t ); |
- throw; |
- } |
- |
- // construct from another shared_any, incrementing ref count. |
- // Only throws if T's copy-c'tor throws, in which case, ref-count |
- // is unchanged. |
- shared_any( shared_any<T,close_policy,invalid_value,unique> const & right ) |
- : m_held( right.m_held ) |
- { |
- } |
- |
- // construct from an auto_any, taking ownership. If allocation |
- // fails, auto_any retains ownership. |
- shared_any( auto_any<T,close_policy,invalid_value,unique> & right ) |
- : m_held( get( right ) ) |
- { |
- release( right ); |
- } |
- |
- // assign from another shared_any |
- shared_any<T,close_policy,invalid_value,unique> & operator=( |
- shared_any<T,close_policy,invalid_value,unique> const & right ) |
- { |
- shared_any<T,close_policy,invalid_value,unique>( right ).swap( *this ); |
- return *this; |
- } |
- |
- // assign from an auto_any |
- shared_any<T,close_policy,invalid_value,unique> & operator=( |
- auto_any<T,close_policy,invalid_value,unique> & right ) |
- { |
- shared_any<T,close_policy,invalid_value,unique>( right ).swap( *this ); |
- return *this; |
- } |
- |
- operator detail::safe_bool() const |
- { |
- return m_held.valid() ? detail::safe_true : detail::safe_false; |
- } |
- |
- bool operator!() const |
- { |
- return ! m_held.valid(); |
- } |
- |
- // return pointer to class object (assume pointer) |
- pointer_type operator->() const |
- { |
- #ifdef SMART_ANY_PTS |
- // You better not be applying operator-> to a handle! |
- static detail::static_assert<!detail::is_handle<T>::value> const cannot_dereference_a_handle; |
- #endif |
- assert( m_held.valid() ); |
- return safe_types::to_pointer( m_held.m_t ); |
- } |
- |
- #ifdef SMART_ANY_PTS |
- // if this shared_any is managing an array, we can use operator[] to index it |
- typename detail::deref<T>::type operator[]( int i ) const |
- { |
- static detail::static_assert<!detail::is_handle<T>::value> const cannot_dereference_a_handle; |
- static detail::static_assert<!detail::is_delete<close_policy>::value> const accessed_like_an_array_but_not_deleted_like_an_array; |
- assert( m_held.valid() ); |
- return m_held.m_t[ i ]; |
- } |
- |
- // unary operator* lets you write code like: |
- // shared_any<foo*,close_delete> pfoo( new foo ); |
- // foo & f = *pfoo; |
- reference_type operator*() const |
- { |
- static detail::static_assert<!detail::is_handle<T>::value> const cannot_dereference_a_handle; |
- assert( m_held.valid() ); |
- return safe_types::to_reference( m_held.m_t ); |
- } |
- #endif |
- |
-private: |
- |
- void swap( shared_any<T,close_policy,invalid_value,unique> & right ) |
- { |
- using std::swap; |
- swap( m_held, right.m_held ); |
- } |
- |
- // if we are wrapping a COM object, then use COM's reference counting. |
- // otherwise, use our own reference counting. |
- typedef typename detail::select< |
- detail::is_com_ptr<T>::value && detail::is_close_release_com<close_policy>::value, |
- detail::intrusive<T,invalid_value_type>, |
- detail::nonintrusive<T,close_policy,invalid_value_type> >::type holder_policy; |
- |
- detail::shared_holder<holder_policy> m_held; |
-}; |
- |
-namespace detail |
-{ |
- template<typename T,class close_policy,class invalid_value,int unique> |
- struct shared_any_helper |
- { |
- static T get( shared_any<T,close_policy,invalid_value,unique> const & t ) |
- { |
- return t.m_held.m_t; |
- } |
- |
- static void reset( shared_any<T,close_policy,invalid_value,unique> & t, T newT ) |
- { |
- shared_any<T,close_policy,invalid_value,unique>( newT ).swap( t ); |
- } |
- |
- static void swap( shared_any<T,close_policy,invalid_value,unique> & left, |
- shared_any<T,close_policy,invalid_value,unique> & right ) |
- { |
- left.swap( right ); |
- } |
- }; |
-} |
- |
-// return wrapped resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline T get( shared_any<T,close_policy,invalid_value,unique> const & t ) |
-{ |
- return detail::shared_any_helper<T,close_policy,invalid_value,unique>::get( t ); |
-} |
- |
-// return true if the shared_any contains a currently valid resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline bool valid( shared_any<T,close_policy,invalid_value,unique> const & t ) |
-{ |
- return t; |
-} |
- |
-// destroy designated object |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline void reset( shared_any<T,close_policy,invalid_value,unique> & t ) |
-{ |
- typedef typename detail::fixup_invalid_value<invalid_value>:: |
- template rebind<T>::type invalid_value_type; |
- detail::shared_any_helper<T,close_policy,invalid_value,unique>::reset( t, invalid_value_type() ); |
-} |
- |
-// destroy designated object and store new resource |
-template<typename T,class close_policy,class invalid_value,int unique,typename U> |
-inline void reset( shared_any<T,close_policy,invalid_value,unique> & t, U newT ) |
-{ |
- detail::shared_any_helper<T,close_policy,invalid_value,unique>::reset( t, newT ); |
-} |
- |
-// swap the contents of two shared_any objects |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline void swap( shared_any<T,close_policy,invalid_value,unique> & left, |
- shared_any<T,close_policy,invalid_value,unique> & right ) |
-{ |
- detail::shared_any_helper<T,close_policy,invalid_value,unique>::swap( left, right ); |
-} |
- |
-// Define some relational operators on shared_* types so they |
-// can be used in hashes and maps |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline bool operator==( |
- shared_any<T,close_policy,invalid_value,unique> const & left, |
- shared_any<T,close_policy,invalid_value,unique> const & right ) |
-{ |
- return get( left ) == get( right ); |
-} |
- |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline bool operator!=( |
- shared_any<T,close_policy,invalid_value,unique> const & left, |
- shared_any<T,close_policy,invalid_value,unique> const & right ) |
-{ |
- return get( left ) != get( right ); |
-} |
- |
-template<typename T,class close_policy,class invalid_value,int unique> |
-inline bool operator<( |
- shared_any<T,close_policy,invalid_value,unique> const & left, |
- shared_any<T,close_policy,invalid_value,unique> const & right ) |
-{ |
- return std::less<T>( get( left ), get( right ) ); |
-} |
- |
-#endif // SHARED_ANY |
- |
-// This causes the shared_* typedefs to be defined |
-DECLARE_SMART_ANY_TYPEDEFS(shared) |