Index: third_party/smartany/smart_any_fwd.h |
diff --git a/third_party/smartany/smart_any_fwd.h b/third_party/smartany/smart_any_fwd.h |
deleted file mode 100644 |
index 17e25713a396e05e55a1c5e05b878a560802c68a..0000000000000000000000000000000000000000 |
--- a/third_party/smartany/smart_any_fwd.h |
+++ /dev/null |
@@ -1,1053 +0,0 @@ |
-//+--------------------------------------------------------------------------- |
-// |
-// Copyright ( C ) Microsoft, 2002. |
-// |
-// File: smart_any_fwd.h |
-// |
-// Contents: automatic resource management |
-// |
-// Classes: auto_any, scoped_any and shared_any |
-// |
-// Functions: get |
-// reset |
-// release |
-// valid |
-// address |
-// |
-// Author: Eric Niebler ( ericne@microsoft.com ) |
-// |
-//---------------------------------------------------------------------------- |
- |
-#ifndef SMART_ANY_FWD |
-#define SMART_ANY_FWD |
- |
-#ifdef _MANAGED |
-#pragma warning( push ) |
-#pragma warning( disable : 4244 ) |
-#include <vcclr.h> |
-#pragma warning( pop ) |
-#endif |
- |
-// Check to see if partial template specialization is available |
-#if _MSC_VER >= 1310 |
-#define SMART_ANY_PTS |
-#endif |
- |
-// forward declare some invalid_value policy classes |
-struct null_t; |
- |
-template<typename T,T value = T(0)> |
-struct value_const; |
- |
-struct close_release_com; |
- |
-// |
-// TEMPLATE CLASS auto_any |
-// |
-template<typename T,class close_policy,class invalid_value = null_t,int unique = 0> |
-class auto_any; |
- |
-// return wrapped resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-T get( auto_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// return true if the auto_any contains a currently valid resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-bool valid( auto_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// return wrapped resource and give up ownership |
-template<typename T,class close_policy,class invalid_value,int unique> |
-T release( auto_any<T,close_policy,invalid_value, unique> & t ); |
- |
-// destroy designated object |
-template<typename T,class close_policy,class invalid_value,int unique> |
-void reset( auto_any<T,close_policy,invalid_value,unique> & t ); |
- |
-// destroy designated object and store new resource |
-template<typename T,class close_policy,class invalid_value,int unique,typename U> |
-void reset( auto_any<T,close_policy,invalid_value,unique> & t, U newT ); |
- |
-// swap the contents of two shared_any objects |
-template<typename T,class close_policy,class invalid_value,int unique> |
-void swap( auto_any<T,close_policy,invalid_value,unique> & left, |
- auto_any<T,close_policy,invalid_value,unique> & right ); |
- |
-// return the address of the wrapped resource |
-// WARNING: this will assert if the value of the resource is |
-// anything other than invalid_value. |
-//template<typename T,class close_policy,class invalid_value,int unique> |
-//T* address( auto_any<T,close_policy,invalid_value,unique> & t ); |
- |
-// |
-// TEMPLATE CLASS shared_any |
-// |
-template<typename T,class close_policy,class invalid_value = null_t,int unique = 0> |
-class shared_any; |
- |
-// return wrapped resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-T get( shared_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// return true if the auto_any contains a currently valid resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-bool valid( shared_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// destroy designated object |
-template<typename T,class close_policy,class invalid_value,int unique> |
-void reset( shared_any<T,close_policy,invalid_value,unique> & t ); |
- |
-// destroy designated object and store new resource |
-template<typename T,class close_policy,class invalid_value,int unique,typename U> |
-void reset( shared_any<T,close_policy,invalid_value,unique> & t, U newT ); |
- |
-// swap the contents of two shared_any objects |
-template<typename T,class close_policy,class invalid_value,int unique> |
-void swap( shared_any<T,close_policy,invalid_value,unique> & left, |
- shared_any<T,close_policy,invalid_value,unique> & right ); |
- |
- |
-// |
-// TEMPLATE CLASS scoped_any |
-// |
-template<typename T,class close_policy,class invalid_value = null_t,int unique = 0> |
-class scoped_any; |
- |
-// return wrapped resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-T get( scoped_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// return true if the auto_any contains a currently valid resource |
-template<typename T,class close_policy,class invalid_value,int unique> |
-bool valid( scoped_any<T,close_policy,invalid_value,unique> const & t ); |
- |
-// return wrapped resource and give up ownership |
-template<typename T,class close_policy,class invalid_value,int unique> |
-T release( scoped_any<T,close_policy,invalid_value, unique> & t ); |
- |
-// destroy designated object |
-template<typename T,class close_policy,class invalid_value,int unique> |
-void reset( scoped_any<T,close_policy,invalid_value,unique> & t ); |
- |
-// destroy designated object and store new resource |
-template<typename T,class close_policy,class invalid_value,int unique,typename U> |
-void reset( scoped_any<T,close_policy,invalid_value,unique> & t, U newT ); |
- |
-// return the address of the wrapped resource |
-// WARNING: this will assert if the value of the resource is |
-// anything other than invalid_value. |
-//template<typename T,class close_policy,class invalid_value,int unique> |
-//T* address( scoped_any<T,close_policy,invalid_value,unique> & t ); |
- |
-// close policy for objects allocated with new |
-struct close_delete; |
- |
-namespace detail |
-{ |
- typedef char (&yes)[1]; |
- typedef char (&no) [2]; |
- |
- struct dummy_struct |
- { |
- void dummy_method() {} |
- }; |
- |
- typedef void (dummy_struct::*safe_bool)(); |
- safe_bool const safe_true = &dummy_struct::dummy_method; |
- safe_bool const safe_false = 0; |
- |
- // Because of older compilers, we can't always use |
- // null_t when we would like to. |
- template<class invalid_value> |
- struct fixup_invalid_value |
- { |
- template<typename> struct rebind { typedef invalid_value type; }; |
- }; |
- |
- // for compile-time assertions |
- template<bool> |
- struct static_assert; |
- |
- template<> |
- struct static_assert<true> |
- { |
- static_assert() {} |
- }; |
- |
- template<typename T> |
- struct static_init |
- { |
- static T const value; |
- }; |
- |
- template<typename T> |
- T const static_init<T>::value = T(); |
- |
- template<bool> |
- struct null_helper // unmanaged |
- { |
- template<typename T> |
- struct inner |
- { |
- static T const get() |
- { |
- return static_init<T>::value; |
- } |
- }; |
- }; |
- |
- template<> |
- struct null_helper<true> // managed |
- { |
- template<typename T> |
- struct inner |
- { |
- static T const get() |
- { |
- return 0; |
- } |
- }; |
- }; |
- |
- typedef char (&yes_t)[1]; |
- typedef char (& no_t)[2]; |
- |
- template<bool> |
- struct select_helper |
- { |
- template<typename T,typename> |
- struct inner { typedef T type; }; |
- }; |
- |
- template<> |
- struct select_helper<false> |
- { |
- template<typename,typename U> |
- struct inner { typedef U type; }; |
- }; |
- |
- template<bool F,typename T,typename U> |
- struct select |
- { |
- typedef typename select_helper<F>::template inner<T,U>::type type; |
- }; |
- |
- |
- template< bool > |
- struct holder_helper |
- { |
- template<typename T> |
- struct inner |
- { |
- typedef T type; |
- }; |
- }; |
- |
- template< typename T > |
- struct remove_ref |
- { |
- typedef T type; |
- }; |
- |
- #ifdef SMART_ANY_PTS |
- template< typename T > |
- struct remove_ref<T&> |
- { |
- typedef T type; |
- }; |
- #endif |
- |
- template<typename T> |
- T* address_of( T & v ) |
- { |
- return reinterpret_cast<T*>( |
- &const_cast<char&>( |
- reinterpret_cast<char const volatile &>(v))); |
- } |
- |
- #ifndef _MANAGED |
- |
- template<typename T> |
- struct is_managed |
- { |
- static bool const value = false; |
- }; |
- |
- #else |
- |
- struct managed_convertible |
- { |
- managed_convertible( System::Object const volatile __gc* ); |
- managed_convertible( System::Enum const volatile __gc* ); |
- managed_convertible( System::ValueType const volatile __gc* ); |
- managed_convertible( System::Delegate const volatile __gc* ); |
- }; |
- |
- template<typename T> |
- struct is_managed |
- { |
- private: |
- static yes_t check( managed_convertible ); |
- static no_t __cdecl check( ... ); |
- static typename remove_ref<T>::type & make(); |
- public: |
- static bool const value = sizeof( yes_t ) == sizeof( check( make() ) ); |
- }; |
- |
- #ifdef SMART_ANY_PTS |
- template<typename T> |
- struct is_managed<T __gc&> |
- { |
- static bool const value = true; |
- }; |
- template<typename T> |
- struct is_managed<T __gc*> |
- { |
- static bool const value = true; |
- }; |
- template<typename T> |
- struct is_managed<T __gc*const> |
- { |
- static bool const value = is_managed<T __gc*>::value; |
- }; |
- template<typename T> |
- struct is_managed<T __gc*volatile> |
- { |
- static bool const value = is_managed<T __gc*>::value; |
- }; |
- template<typename T> |
- struct is_managed<T __gc*const volatile> |
- { |
- static bool const value = is_managed<T __gc*>::value; |
- }; |
- #endif |
- template<> |
- struct is_managed<System::Void __gc*> |
- { |
- static bool const value = true; |
- }; |
- template<> |
- struct is_managed<System::Void const __gc*> |
- { |
- static bool const value = true; |
- }; |
- template<> |
- struct is_managed<System::Void volatile __gc*> |
- { |
- static bool const value = true; |
- }; |
- template<> |
- struct is_managed<System::Void const volatile __gc*> |
- { |
- static bool const value = true; |
- }; |
- |
- template<> |
- struct holder_helper<true> |
- { |
- template<typename T> |
- struct inner |
- { |
- typedef gcroot<T> type; |
- }; |
- }; |
- #endif |
- |
- template<typename T> |
- struct holder |
- { |
- typedef typename holder_helper<is_managed<T>::value>::template inner<T>::type type; |
- }; |
- |
- template<typename T> |
- struct is_delete |
- { |
- static bool const value = false; |
- }; |
- |
- template<> |
- struct is_delete<close_delete> |
- { |
- static bool const value = true; |
- }; |
- |
- // dummy type, don't define |
- struct smart_any_cannot_dereference; |
- |
- // For use in implementing unary operator* |
- template<typename T> |
- struct deref |
- { |
- typedef smart_any_cannot_dereference type; // will cause a compile error by default |
- }; |
- |
- #ifndef SMART_ANY_PTS |
- |
- // Old compiler needs extra help |
- template<> |
- struct fixup_invalid_value<null_t> |
- { |
- template<typename T> struct rebind { typedef value_const<T> type; }; |
- }; |
- |
- #else |
- |
- template<typename T,typename U> |
- struct same_type |
- { |
- static const bool value = false; |
- }; |
- |
- template<typename T> |
- struct same_type<T,T> |
- { |
- static const bool value = true; |
- }; |
- |
- // Handle reference types |
- template<typename T> |
- struct deref<T&> |
- { |
- typedef typename deref<T>::type type; |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T*> |
- { |
- typedef T& type; // The result of dereferencing a T* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T*const> |
- { |
- typedef typename deref<T*>::type type; // The result of dereferencing a T* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T*volatile> |
- { |
- typedef typename deref<T*>::type type; // The result of dereferencing a T* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T*const volatile> |
- { |
- typedef typename deref<T*>::type type; // The result of dereferencing a T* |
- }; |
- |
- // Fully specialize for void* |
- template<> |
- struct deref<void*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a void* |
- }; |
- |
- // Fully specialize for void const* |
- template<> |
- struct deref<void const*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a void* |
- }; |
- |
- // Fully specialize for void volatile* |
- template<> |
- struct deref<void volatile*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a void* |
- }; |
- |
- // Fully specialize for void const volatile* |
- template<> |
- struct deref<void const volatile*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a void* |
- }; |
- |
- #ifdef _MANAGED |
- // Handle reference types |
- template<typename T> |
- struct deref<T __gc&> |
- { |
- typedef typename deref<T>::type type; |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T __gc*> |
- { |
- typedef T __gc& type; // The result of dereferencing a T __gc* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T __gc*const> |
- { |
- typedef typename deref<T __gc*>::type type; // The result of dereferencing a T __gc* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T __gc*volatile> |
- { |
- typedef typename deref<T __gc*>::type type; // The result of dereferencing a T __gc* |
- }; |
- |
- // Partially specialize for pointer types |
- template<typename T> |
- struct deref<T __gc*const volatile> |
- { |
- typedef typename deref<T __gc*>::type type; // The result of dereferencing a T __gc* |
- }; |
- |
- // Fully specialize for void* |
- template<> |
- struct deref<System::Void __gc*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a System::Void __gc* |
- }; |
- |
- // Fully specialize for void const* |
- template<> |
- struct deref<System::Void const __gc*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a System::Void __gc* |
- }; |
- |
- // Fully specialize for void volatile* |
- template<> |
- struct deref<System::Void volatile __gc*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a System::Void __gc* |
- }; |
- |
- // Fully specialize for void const volatile* |
- template<> |
- struct deref<System::Void const volatile __gc*> |
- { |
- typedef smart_any_cannot_dereference type; // cannot dereference a System::Void __gc* |
- }; |
- #endif |
- |
- // The DECLARE_HANDLE macro in winnt.h defines a handle to be a pointer |
- // to a struct containing one member named "unused" of type int. We can |
- // use that information to make auto_any safer by disallowing actions like |
- // dereferencing a handle or calling delete on a handle. |
- template<typename T> |
- struct has_unused |
- { |
- private: |
- template<class U,int U::*> struct wrap_t; |
- template<typename U> static yes_t check( wrap_t<U,&U::unused>* ); |
- template<typename U> static no_t __cdecl check( ... ); |
- public: |
- static bool const value = ( sizeof(check<T>(0)) == sizeof(yes_t) ); |
- }; |
- |
- template<typename T> |
- struct is_handle_helper |
- { |
- static bool const value = ( sizeof(T)==sizeof(int) && has_unused<T>::value ); |
- }; |
- |
- #ifdef _MANAGED |
- template<typename T> |
- struct is_handle_helper<T __gc&> |
- { |
- static bool const value = false; |
- }; |
- #endif |
- |
- template<> |
- struct is_handle_helper<smart_any_cannot_dereference> |
- { |
- static bool const value = false; |
- }; |
- |
- // used to see whether a given type T is a handle type or not. |
- template<typename T> |
- struct is_handle |
- { |
- private: |
- typedef typename remove_ref<typename deref<T>::type>::type deref_t; |
- public: |
- static bool const value = |
- ( same_type<T,void*>::value || is_handle_helper<deref_t>::value ); |
- }; |
- #endif |
- |
- template<typename T,class close_policy> |
- struct safe_types |
- { |
- typedef T pointer_type; |
- typedef typename deref<T>::type reference_type; |
- |
- static pointer_type to_pointer( T t ) |
- { |
- return t; |
- } |
- static reference_type to_reference( T t ) |
- { |
- return *t; |
- } |
- }; |
- |
- #ifdef SMART_ANY_PTS |
- template<typename T> |
- class no_addref_release : public T |
- { |
- unsigned long __stdcall AddRef(); |
- unsigned long __stdcall Release(); |
- }; |
- |
- // shouldn't be able to call AddRef or Release |
- // through a smart COM wrapper |
- template<typename T> |
- struct safe_types<T*,close_release_com> |
- { |
- typedef no_addref_release<T>* pointer_type; |
- typedef no_addref_release<T>& reference_type; |
- |
- static pointer_type to_pointer( T* t ) |
- { |
- return static_cast<pointer_type>( t ); |
- } |
- static reference_type to_reference( T* t ) |
- { |
- return *static_cast<pointer_type>( t ); |
- } |
- }; |
- #endif |
-} |
- |
-// a generic close policy that uses a ptr to a function |
-template<typename Fn, Fn Pfn> |
-struct close_fun |
-{ |
- template<typename T> |
- static void close( T t ) |
- { |
- Pfn( t ); |
- } |
-}; |
- |
-// free an object allocated with new by calling delete |
-struct close_delete |
-{ |
- template<typename T> |
- static void close( T * p ) |
- { |
- // This will fail only if T is an incomplete type. |
- static detail::static_assert<0 != sizeof( T )> const cannot_delete_an_incomplete_type; |
- |
- #ifdef SMART_ANY_PTS |
- // This checks to make sure we're not calling delete on a HANDLE |
- static detail::static_assert<!detail::is_handle<T*>::value> const cannot_delete_a_handle; |
- #endif |
- |
- delete p; |
- } |
- |
- #ifdef _MANAGED |
- template<typename T> |
- static void close( gcroot<T __gc*> const & p ) |
- { |
- delete static_cast<T __gc*>( p ); |
- } |
- #endif |
-}; |
- |
-// free an array allocated with new[] by calling delete[] |
-struct close_delete_array |
-{ |
- template<typename T> |
- static void close( T * p ) |
- { |
- // This will fail only if T is an incomplete type. |
- static detail::static_assert<0 != sizeof( T )> const cannot_delete_an_incomplete_type; |
- |
- #ifdef SMART_ANY_PTS |
- // This checks to make sure we're not calling delete on a HANDLE |
- static detail::static_assert<!detail::is_handle<T*>::value> const cannot_delete_a_handle; |
- #endif |
- |
- delete [] p; |
- } |
- |
- //#ifdef _MANAGED |
- // This is broken because of compiler bugs |
- //template<typename T> |
- //static void close( gcroot<T __gc* __gc[]> const & p ) |
- //{ |
- // delete [] static_cast<T __gc* __gc[]>( p ); |
- //} |
- //#endif |
-}; |
- |
-// for releasing a COM object |
-struct close_release_com |
-{ |
- template<typename T> |
- static void close( T p ) |
- { |
- p->Release(); |
- } |
-}; |
- |
-// for releasing a __gc IDisposable object |
-struct close_dispose |
-{ |
- template<typename T> |
- static void close( T p ) |
- { |
- p->Dispose(); |
- } |
-}; |
- |
-// some generic invalid_value policies |
- |
-struct null_t |
-{ |
- template<typename T> |
- operator T const() const |
- { |
- return detail::null_helper<detail::is_managed<T>::value>::template inner<T>::get(); |
- } |
-}; |
- |
-template<typename T,T value> |
-struct value_const |
-{ |
- operator T const() const |
- { |
- return value; |
- } |
-}; |
- |
-template<typename T,T const* value_ptr> |
-struct value_const_ptr |
-{ |
- operator T const&() const |
- { |
- return *value_ptr; |
- } |
-}; |
- |
-#ifdef SMART_ANY_PTS |
-template<typename T, T const& value> |
-struct value_ref |
-{ |
- operator T const&() const |
- { |
- return value; |
- } |
-}; |
-#endif |
- |
-#endif // SMART_ANY_FWD |
- |
- |
-// |
-// Define some other useful close polcies |
-// |
- |
-#if defined(_INC_STDLIB) | defined(_INC_MALLOC) |
-typedef void (__cdecl *pfn_free_t)( void* ); |
-typedef close_fun<pfn_free_t,static_cast<pfn_free_t>(&free)> close_free; |
-#endif |
- |
-#if defined(_INC_STDIO) & !defined(SMART_CLOSE_FILE_PTR) |
-# define SMART_CLOSE_FILE_PTR |
- // don't close a FILE* if it is stdin, stdout or stderr |
- struct close_file_ptr |
- { |
- static void close( FILE * pfile ) |
- { |
- if( pfile != stdin && pfile != stdout && pfile != stderr ) |
- { |
- fclose( pfile ); |
- } |
- } |
- }; |
-#endif |
- |
-#ifdef _WINDOWS_ |
- |
-# ifndef SMART_VIRTUAL_FREE |
-# define SMART_VIRTUAL_FREE |
- // free memory allocated with VirtualAlloc |
- struct close_virtual_free |
- { |
- static void close( void * p ) |
- { |
- ::VirtualFree( p, 0, MEM_RELEASE ); |
- } |
- }; |
-# endif |
- |
- typedef close_fun<BOOL (__stdcall *)( HANDLE ),CloseHandle> close_handle; |
- typedef close_fun<BOOL (__stdcall *)( HANDLE ),FindClose> close_find; |
- typedef close_fun<BOOL (__stdcall *)( HANDLE ),FindCloseChangeNotification> close_find_change_notification; |
- typedef close_fun<BOOL (__stdcall *)( HINSTANCE ),FreeLibrary> close_library; |
- typedef close_fun<LONG (__stdcall *)( HKEY ),RegCloseKey> close_regkey; |
- typedef close_fun<BOOL (__stdcall *)( LPCVOID ),UnmapViewOfFile> close_file_view; |
- typedef close_fun<BOOL (__stdcall *)( HICON ),DestroyIcon> close_hicon; |
- typedef close_fun<BOOL (__stdcall *)( HGDIOBJ ),DeleteObject> close_hgdiobj; |
- typedef close_fun<BOOL (__stdcall *)( HACCEL ),DestroyAcceleratorTable> close_haccel; |
- typedef close_fun<BOOL (__stdcall *)( HDC ),DeleteDC> close_hdc; |
- typedef close_fun<BOOL (__stdcall *)( HMENU ),DestroyMenu> close_hmenu; |
- typedef close_fun<BOOL (__stdcall *)( HCURSOR ),DestroyCursor> close_hcursor; |
- typedef close_fun<BOOL (__stdcall *)( HWND ),DestroyWindow> close_window; |
- typedef close_fun<BOOL (__stdcall *)( HANDLE ),HeapDestroy> close_heap_destroy; |
- typedef close_fun<HLOCAL (__stdcall *)( HLOCAL ),LocalFree> close_local_free; |
- typedef close_fun<BOOL (__stdcall *)( HDESK ),CloseDesktop> close_hdesk; |
- typedef close_fun<BOOL (__stdcall *)( HHOOK ),UnhookWindowsHookEx> close_hhook; |
- typedef close_fun<BOOL (__stdcall *)( HWINSTA ),CloseWindowStation> close_hwinsta; |
- typedef close_fun<BOOL (__stdcall *)( HANDLE ),DeregisterEventSource> close_event_source; |
- typedef close_fun<HGLOBAL (__stdcall *)( HGLOBAL ),GlobalFree> close_global_free; |
- |
- typedef value_const<HANDLE,INVALID_HANDLE_VALUE> invalid_handle_t; |
-#endif |
- |
-#ifdef _OLEAUTO_H_ |
- typedef close_fun<void (__stdcall *)(BSTR),SysFreeString> close_bstr; |
-#endif |
- |
-#ifdef __MSGQUEUE_H__ |
- typedef close_fun<BOOL (__stdcall *)(HANDLE),CloseMsgQueue> close_msg_queue; |
-#endif |
- |
-#if defined(_WININET_) | defined(_DUBINET_) |
- typedef close_fun<BOOL (__stdcall *)(HINTERNET),InternetCloseHandle> close_hinternet; |
-#endif |
- |
-#ifdef _RAS_H_ |
- typedef close_fun<DWORD (__stdcall *)( HRASCONN ),RasHangUp> close_hrasconn; |
-#endif |
- |
-#if defined(__RPCDCE_H__) & !defined(SMART_ANY_RPC) |
-# define SMART_ANY_RPC |
- // for releaseing an rpc binding |
- struct close_rpc_binding |
- { |
- static void close( RPC_BINDING_HANDLE & h ) |
- { |
- ::RpcBindingFree( &h ); |
- } |
- }; |
- // for releaseing an rpc binding vector |
- struct close_rpc_vector |
- { |
- static void close( RPC_BINDING_VECTOR __RPC_FAR * & p ) |
- { |
- ::RpcBindingVectorFree( &p ); |
- } |
- }; |
- // for releasing a RPC string |
- struct close_rpc_string |
- { |
- static void close( unsigned char __RPC_FAR * & p ) |
- { |
- ::RpcStringFreeA(&p); |
- } |
- static void close( unsigned short __RPC_FAR * & p ) |
- { |
- ::RpcStringFreeW(&p); |
- } |
- }; |
-#endif |
- |
-#ifdef _WINSVC_ |
- typedef close_fun<BOOL (__stdcall *)( SC_HANDLE ),CloseServiceHandle> close_service; |
- typedef close_fun<BOOL (__stdcall *)( SC_LOCK ),UnlockServiceDatabase> unlock_service; |
-#endif |
- |
-#ifdef _WINSOCKAPI_ |
- typedef int (__stdcall *pfn_closock_t)( SOCKET ); |
- typedef close_fun<pfn_closock_t,static_cast<pfn_closock_t>(&closesocket)> close_socket; |
- typedef value_const<SOCKET,INVALID_SOCKET> invalid_socket_t; |
-#endif |
- |
-#ifdef _OBJBASE_H_ |
- // For use when releasing memory allocated with CoTaskMemAlloc |
- typedef close_fun<void (__stdcall*)( LPVOID ),CoTaskMemFree> close_co_task_free; |
-#endif |
- |
- |
-// |
-// Below are useful smart typedefs for some common Windows/CRT resource types. |
-// |
- |
-#undef DECLARE_SMART_ANY_TYPEDEFS_STDIO |
-#undef DECLARE_SMART_ANY_TYPEDEFS_WINDOWS |
-#undef DECLARE_SMART_ANY_TYPEDEFS_OLEAUTO |
-#undef DECLARE_SMART_ANY_TYPEDEFS_MSGQUEUE |
-#undef DECLARE_SMART_ANY_TYPEDEFS_WININET |
-#undef DECLARE_SMART_ANY_TYPEDEFS_RAS |
-#undef DECLARE_SMART_ANY_TYPEDEFS_RPCDCE |
-#undef DECLARE_SMART_ANY_TYPEDEFS_WINSVC |
-#undef DECLARE_SMART_ANY_TYPEDEFS_WINSOCKAPI |
-#undef DECLARE_SMART_ANY_TYPEDEFS_OBJBASE |
- |
-#define DECLARE_SMART_ANY_TYPEDEFS_STDIO(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_WINDOWS(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_OLEAUTO(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_MSGQUEUE(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_WININET(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_RAS(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_RPCDCE(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_WINSVC(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_WINSOCKAPI(prefix) |
-#define DECLARE_SMART_ANY_TYPEDEFS_OBJBASE(prefix) |
- |
-#ifdef _INC_STDIO |
-# undef DECLARE_SMART_ANY_TYPEDEFS_STDIO |
-# define DECLARE_SMART_ANY_TYPEDEFS_STDIO(prefix) \ |
- typedef prefix ## _any<FILE*,close_file_ptr> prefix ## _file_ptr; |
-#endif |
- |
-#ifdef _WINDOWS_ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_WINDOWS |
-# define DECLARE_SMART_ANY_TYPEDEFS_WINDOWS(prefix) \ |
- typedef prefix ## _any<HKEY,close_regkey> prefix ## _hkey; \ |
- typedef prefix ## _any<HANDLE,close_find,invalid_handle_t> prefix ## _hfind; \ |
- typedef prefix ## _any<HANDLE,close_find_change_notification,invalid_handle_t> prefix ## _hfind_change_notification; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t> prefix ## _hfile; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,1> prefix ## _communications_device; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,2> prefix ## _console_input; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,3> prefix ## _console_input_buffer; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,4> prefix ## _console_output; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,5> prefix ## _mailslot; \ |
- typedef prefix ## _any<HANDLE,close_handle,invalid_handle_t,6> prefix ## _pipe; \ |
- typedef prefix ## _any<HANDLE,close_handle> prefix ## _handle; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,1> prefix ## _access_token; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,2> prefix ## _event; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,3> prefix ## _file_mapping; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,4> prefix ## _job; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,5> prefix ## _mutex; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,6> prefix ## _process; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,7> prefix ## _semaphore; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,8> prefix ## _thread; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,9> prefix ## _timer; \ |
- typedef prefix ## _any<HANDLE,close_handle,null_t,10> prefix ## _completion_port; \ |
- typedef prefix ## _any<HDC,close_hdc> prefix ## _hdc; \ |
- typedef prefix ## _any<HICON,close_hicon> prefix ## _hicon; \ |
- typedef prefix ## _any<HMENU,close_hmenu> prefix ## _hmenu; \ |
- typedef prefix ## _any<HCURSOR,close_hcursor> prefix ## _hcursor; \ |
- typedef prefix ## _any<HPEN,close_hgdiobj,null_t,1> prefix ## _hpen; \ |
- typedef prefix ## _any<HRGN,close_hgdiobj,null_t,2> prefix ## _hrgn; \ |
- typedef prefix ## _any<HFONT,close_hgdiobj,null_t,3> prefix ## _hfont; \ |
- typedef prefix ## _any<HBRUSH,close_hgdiobj,null_t,4> prefix ## _hbrush; \ |
- typedef prefix ## _any<HBITMAP,close_hgdiobj,null_t,5> prefix ## _hbitmap; \ |
- typedef prefix ## _any<HPALETTE,close_hgdiobj,null_t,6> prefix ## _hpalette; \ |
- typedef prefix ## _any<HACCEL,close_haccel> prefix ## _haccel; \ |
- typedef prefix ## _any<HWND,close_window> prefix ## _window; \ |
- typedef prefix ## _any<HINSTANCE,close_library> prefix ## _library; \ |
- typedef prefix ## _any<LPVOID,close_file_view> prefix ## _file_view; \ |
- typedef prefix ## _any<LPVOID,close_virtual_free> prefix ## _virtual_ptr; \ |
- typedef prefix ## _any<HANDLE,close_heap_destroy> prefix ## _heap; \ |
- typedef prefix ## _any<HLOCAL,close_local_free> prefix ## _hlocal; \ |
- typedef prefix ## _any<HDESK,close_hdesk> prefix ## _hdesk; \ |
- typedef prefix ## _any<HHOOK,close_hhook> prefix ## _hhook; \ |
- typedef prefix ## _any<HWINSTA,close_hwinsta> prefix ## _hwinsta; \ |
- typedef prefix ## _any<HANDLE,close_event_source> prefix ## _event_source; \ |
- typedef prefix ## _any<HGLOBAL,close_global_free> prefix ## _hglobal; |
-#endif |
- |
-// |
-// Define some other useful typedefs |
-// |
- |
-#ifdef _OLEAUTO_H_ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_OLEAUTO |
-# define DECLARE_SMART_ANY_TYPEDEFS_OLEAUTO(prefix) \ |
- typedef prefix ## _any<BSTR,close_bstr> prefix ## _bstr; |
-#endif |
- |
-#ifdef __MSGQUEUE_H__ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_MSGQUEUE |
-# define DECLARE_SMART_ANY_TYPEDEFS_MSGQUEUE(prefix) \ |
- typedef prefix ## _any<HANDLE,close_msg_queue> prefix ## _msg_queue; |
-#endif |
- |
-#if defined(_WININET_) | defined(_DUBINET_) |
-# undef DECLARE_SMART_ANY_TYPEDEFS_WININET |
-# define DECLARE_SMART_ANY_TYPEDEFS_WININET(prefix) \ |
- typedef prefix ## _any<HINTERNET,close_hinternet> prefix ## _hinternet; |
-#endif |
- |
-#ifdef _RAS_H_ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_RAS |
-# define DECLARE_SMART_ANY_TYPEDEFS_RAS(prefix) \ |
- typedef prefix ## _any<HRASCONN,close_hrasconn> prefix ## _hrasconn; |
-#endif |
- |
-#ifdef __RPCDCE_H__ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_RPCDCE |
-# ifdef UNICODE |
-# define DECLARE_SMART_ANY_TYPEDEFS_RPCDCE(prefix) \ |
- typedef prefix ## _any<RPC_BINDING_HANDLE,close_rpc_binding> prefix ## _rpc_binding; \ |
- typedef prefix ## _any<RPC_BINDING_VECTOR __RPC_FAR*,close_rpc_vector> prefix ## _rpc_binding_vector; \ |
- typedef prefix ## _any<unsigned char __RPC_FAR*,close_rpc_string> prefix ## _rpc_string_A; \ |
- typedef prefix ## _any<unsigned short __RPC_FAR*,close_rpc_string> prefix ## _rpc_string_W; \ |
- typedef prefix ## _rpc_string_W prefix ## _rpc_string; |
-# else |
-# define DECLARE_SMART_ANY_TYPEDEFS_RPCDCE(prefix) \ |
- typedef prefix ## _any<RPC_BINDING_HANDLE,close_rpc_binding> prefix ## _rpc_binding; \ |
- typedef prefix ## _any<RPC_BINDING_VECTOR __RPC_FAR*,close_rpc_vector> prefix ## _rpc_binding_vector; \ |
- typedef prefix ## _any<unsigned char __RPC_FAR*,close_rpc_string> prefix ## _rpc_string_A; \ |
- typedef prefix ## _any<unsigned short __RPC_FAR*,close_rpc_string> prefix ## _rpc_string_W; \ |
- typedef prefix ## _rpc_string_A prefix ## _rpc_string; |
-# endif |
-#endif |
- |
-#ifdef _WINSVC_ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_WINSVC |
-# define DECLARE_SMART_ANY_TYPEDEFS_WINSVC(prefix) \ |
- typedef prefix ## _any<SC_HANDLE,close_service> prefix ## _service; \ |
- typedef prefix ## _any<SC_LOCK,unlock_service> prefix ## _service_lock; |
-#endif |
- |
-#ifdef _WINSOCKAPI_ |
-# undef DECLARE_SMART_ANY_TYPEDEFS_WINSOCKAPI |
-# define DECLARE_SMART_ANY_TYPEDEFS_WINSOCKAPI(prefix) \ |
- typedef prefix ## _any<SOCKET,close_socket,invalid_socket_t> prefix ## _socket; |
-#endif |
- |
-#if defined(_OBJBASE_H_) & !defined(SMART_ANY_CO_INIT) |
-# define SMART_ANY_CO_INIT |
- inline HRESULT smart_co_init_helper( DWORD dwCoInit ) |
- { |
- (void) dwCoInit; |
-# if (_WIN32_WINNT >= 0x0400 ) | defined(_WIN32_DCOM) |
- return ::CoInitializeEx(0,dwCoInit); |
-# else |
- return ::CoInitialize(0); |
-# endif |
- } |
- inline void smart_co_uninit_helper( HRESULT hr ) |
- { |
- if (SUCCEEDED(hr)) |
- ::CoUninitialize(); |
- } |
- typedef close_fun<void(*)(HRESULT),smart_co_uninit_helper> close_co; |
- typedef value_const<HRESULT,CO_E_NOTINITIALIZED> co_not_init; |
-# undef DECLARE_SMART_ANY_TYPEDEFS_OBJBASE |
-# define DECLARE_SMART_ANY_TYPEDEFS_OBJBASE(prefix) \ |
- typedef prefix ## _any<LPVOID,close_co_task_free> prefix ## _co_task_ptr; |
-#endif |
- |
- |
-#define DECLARE_SMART_ANY_TYPEDEFS(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_STDIO(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_WINDOWS(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_OLEAUTO(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_MSGQUEUE(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_WININET(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_RAS(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_RPCDCE(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_WINSVC(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_WINSOCKAPI(prefix) \ |
- DECLARE_SMART_ANY_TYPEDEFS_OBJBASE(prefix) |