#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