SAFEARRAY and STL algorithms
От: ssm Россия  
Дата: 23.04.03 13:43
Оценка: 65 (5)
Шаблон, позволяющий использовать SAFEARRAY с алгоритмами STL

template<typename T>
class safe_array_vector{    
    SAFEARRAY *pSA;
    T *data;
    size_t length(){return pSA->rgsabound->cElements;}
public:    

    typedef T*          iterator;
    typedef const T*    const_iterator;    
    typedef std::reverse_iterator<iterator, T, T&, ptrdiff_t>  
        reverse_iterator;
    typedef std::reverse_iterator<const_iterator, T, const T&, ptrdiff_t>  
        const_reverse_iterator;
    

    iterator begin(){return data;}
    const_iterator begin() const {return data;}    
    iterator end(){return data + length();}
    const_iterator end() const {return data + length();}

    reverse_iterator rbegin(){ return reverse_iterator(end());}
    const_reverse_iterator rbegin() const{ return const_reverse_iterator(end());}
    reverse_iterator rend(){ return reverse_iterator(begin());}
    const_reverse_iterator rend() const{ return const_reverse_iterator(begin());}

    explicit safe_array_vector(SAFEARRAY *pSA) : pSA(pSA){
        ATLASSERT(pSA);
        SafeArrayAccessData(pSA, (void**)&data);
    }
    ~safe_array_vector(){SafeArrayUnaccessData(pSA);}


    SAFEARRAY * operator->(){return pSA;}
    const SAFEARRAY * operator->() const{return pSA;}
};


Использование:

VARIANT variant_;
...
{
  safe_array_vector<BSTR> vec(variant_.parray);
  std::for_each(vec.begin(), vec.end(), ... );
}
Re: SAFEARRAY and STL algorithms
От: Андрей Россия  
Дата: 24.04.03 03:53
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Шаблон, позволяющий использовать SAFEARRAY с алгоритмами STL


skip

А чем тебе реализация того же от MS не нравится? (Я имею ввиду то, что в файле T_SafeVector.h из Platform SDK)
Re[2]: SAFEARRAY and STL algorithms
От: ssm Россия  
Дата: 24.04.03 07:13
Оценка:
Здравствуйте, Андрей, Вы писали:


А>А чем тебе реализация того же от MS не нравится? (Я имею ввиду то, что в файле T_SafeVector.h из Platform SDK)


Я и неподозревал о ее существовании Правда, насколько я понял, в этой реализации данные из SAFEARRAY копируются во внутренне представление, что не всегда допустимо. Кстати попутно нашел еще такую вот чучу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.