#if !defined SAFEARRAY_H_19882B42_E3AB_4fa8_984B_2CBDB734585A
#define SAFEARRAY_H_19882B42_E3AB_4fa8_984B_2CBDB734585A

#include <iterator>
#include "Variant.h"
#include "Debug.h"

namespace kaBasicClasses 
{

template < typename T >
class SafeArray {
	public:
		//
		SafeArray() : theArray(NULL) {}
		explicit SafeArray( VARIANT& v ) : theArray(NULL) { set(&v); }
		explicit SafeArray( SAFEARRAY& a ) : theArray(NULL) { set(&a); }
		~SafeArray() { set((SAFEARRAY*)NULL); }
		SAFEARRAY* detach()
		{
			SAFEARRAY* result=theArray;
			set((SAFEARRAY*)NULL);
			return result;
		}
		//
		class iterator : public std::iterator<std::bidirectional_iterator_tag,T> 
		{
			public:
				inline T& operator*() { return *i; }
				inline void operator++() { ++i; }
				inline void operator--() { --i; }
				inline void operator++(int) { ++i; }
				inline void operator--(int) { --i; }
				inline bool operator==( iterator& it ) { return it.i==i; }
				inline bool operator!=( iterator& it ) { return it.i!=i; }
			protected:
				iterator( T* data, int pos ) : i(data+pos) {}
			protected:
				T* i;
		}; //iterator
		iterator begin() 
		{ 
			return iterator(theData,0); 
		}
		iterator end() 
		{ 
			return iterator(theData,theArray->rgsabound->cElements); 
		}
	protected:
		void set( VARIANT* v ) 
		{
			if( v==NULL )
			{
				set( (SAFEARRAY *)NULL );
				return;
			}
			CHECK( v->vt & VT_ARRAY, std::exception );
			set( v->parray );
		}
		
		void set( SAFEARRAY* a )	
		{
			if( theArray!=NULL )
			{
				CHECK( SafeArrayUnaccessData(theArray)==S_OK, std::exception )
			}
			theArray=NULL;
			if( a==NULL )
				return;
			CHECK( SafeArrayAccessData(a,(void **)&theData)==S_OK, std::exception )
			theArray=a;
		}
	protected:
		SAFEARRAY* theArray;
		T* theData;
}; //SafeArray

template <typename iter, typename dataType>
SAFEARRAY* createSafeArrayOfVariants( iter begin, iter end )
{
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound=0;
	long N=(long )distance(begin,end)+1;
	rgsabound[0].cElements=N;
	SAFEARRAY* result=SafeArrayCreate( VT_VARIANT, 1, rgsabound );
	SafeArray<Variant> array(*result);
	SafeArray<Variant>::iterator i=array.begin();
	for( ; begin<end; ++begin )
	{
		VariantInit(&*i);
		((CComVariant &)(*i))=(*begin);
		++i;
	}
	return array.detach();
}



}; //kaBasicClasses

#endif //SAFEARRAY_H_19882B42_E3AB_4fa8_984B_2CBDB734585A


Hosted by www.Geocities.ws

1