April 15, 2007 Re: [COMSTL; Adi's report] interface_cast + interface pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to Matthew Wilson Attachments:
| Hi, I wrote a little proof-of-concept shim for doing this. It seems to work as expected, while preventing naive misuse. template <class T> class raw_assignment_shim { *public:* operator T::resource_type*() // conversion op { return &res_; } ~raw_assignment_shim() // dtor { // do some checks here... ref_.set(res_, false); } *private:* friend raw_assignment_shim<T> make_raw_assignment_shim(T& ref); raw_assignment_shim(T& ref): // private ctor res_(ref.get()), ref_(ref) {} T::resource_type operator*(); // not implemented. Prevents de-ref. *private:* T::resource_type res_; T& ref_; }; template <class T> raw_assignment_shim<T> make_raw_assignment_shim(T& ref) { return raw_assignment_shim<T>(ref); } /////////////////////////////////////////////////////////////////////////////////// bool SequenceProcessor::createFilterGraph(string filename) { using winstl::a2w; // Create a source filter specified by filename *ref_ptr<IBaseFilter> pSource;* if(FAILED(pGraph->AddSourceFilter(a2w(filename),0, *make_raw_assignment_shim(pSource)*))) { ::MessageBox( NULL, "Unable to create source filter", "Error", MB_OK | MB_ICONINFORMATION ); return 0; } /* // original code... // Create a source filter specified by filename ref_ptr<IBaseFilter> pSource; { IBaseFilter* ppSource= NULL; if(FAILED(pGraph->AddSourceFilter(a2w(filename),0,&ppSource))) { ::MessageBox( NULL, "Unable to create source filter", "Error", MB_OK | MB_ICONINFORMATION ); return 0; } pSource.set(ppSource, false); } */ ... Of course, the names can be changed, and some refinements should probably be added. Such as limit it only for initializing an empty (NULL) ref_ptr<>, exceptions etc. What do you think? Adi |
April 28, 2007 Re: [COMSTL; Adi's report] interface_cast + interface pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adi Shavit Attachments:
| Any comments on this?
Adi Shavit wrote:
> Hi,
>
> I wrote a little proof-of-concept shim for doing this.
> It seems to work as expected, while preventing naive misuse.
>
> template <class T>
> class raw_assignment_shim
> {
> *public:*
> operator T::resource_type*() // conversion op
> { return &res_; }
>
> ~raw_assignment_shim() // dtor
> {
> // do some checks here...
> ref_.set(res_, false);
> }
>
> *private:*
>
> friend raw_assignment_shim<T> make_raw_assignment_shim(T& ref);
>
> raw_assignment_shim(T& ref): // private ctor
> res_(ref.get()),
> ref_(ref)
> {}
>
> T::resource_type operator*(); // not implemented. Prevents de-ref.
>
> *private:*
>
> T::resource_type res_;
> T& ref_;
> };
>
>
> template <class T>
> raw_assignment_shim<T> make_raw_assignment_shim(T& ref)
> { return raw_assignment_shim<T>(ref); }
>
>
> ///////////////////////////////////////////////////////////////////////////////////
>
> bool SequenceProcessor::createFilterGraph(string filename)
> {
> using winstl::a2w;
>
> // Create a source filter specified by filename
> *ref_ptr<IBaseFilter> pSource;*
> if(FAILED(pGraph->AddSourceFilter(a2w(filename),0,
> *make_raw_assignment_shim(pSource)*)))
> {
> ::MessageBox( NULL, "Unable to create source filter",
> "Error", MB_OK | MB_ICONINFORMATION );
> return 0;
> }
>
> /* // original code...
> // Create a source filter specified by filename
> ref_ptr<IBaseFilter> pSource;
> {
> IBaseFilter* ppSource= NULL;
>
> if(FAILED(pGraph->AddSourceFilter(a2w(filename),0,&ppSource)))
> {
> ::MessageBox( NULL, "Unable to create source filter",
> "Error", MB_OK | MB_ICONINFORMATION );
> return 0;
> }
> pSource.set(ppSource, false);
> }
> */
> ...
>
> Of course, the names can be changed, and some refinements should
> probably be added.
> Such as limit it only for initializing an empty (NULL) ref_ptr<>,
> exceptions etc.
>
> What do you think?
> Adi
>
>
>
|
April 28, 2007 Re: [COMSTL; Adi's report] interface_cast + interface pointers | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adi Shavit Attachments:
| There will be. Am crammed with the very last bits of XSTL - CD, index, final page proofs. After that, things will be more 'Active'. (Get it?!?! <g>) "Adi Shavit" <adish@gentech.co.il> wrote in message news:f0vcml$kcd$1@digitalmars.com... Any comments on this? Adi Shavit wrote: Hi, I wrote a little proof-of-concept shim for doing this. It seems to work as expected, while preventing naive misuse. template <class T> class raw_assignment_shim { public: operator T::resource_type*() // conversion op { return &res_; } ~raw_assignment_shim() // dtor { // do some checks here... ref_.set(res_, false); } private: friend raw_assignment_shim<T> make_raw_assignment_shim(T& ref); raw_assignment_shim(T& ref): // private ctor res_(ref.get()), ref_(ref) {} T::resource_type operator*(); // not implemented. Prevents de-ref. private: T::resource_type res_; T& ref_; }; template <class T> raw_assignment_shim<T> make_raw_assignment_shim(T& ref) { return raw_assignment_shim<T>(ref); } /////////////////////////////////////////////////////////////////////////////////// bool SequenceProcessor::createFilterGraph(string filename) { using winstl::a2w; // Create a source filter specified by filename ref_ptr<IBaseFilter> pSource; if(FAILED(pGraph->AddSourceFilter(a2w(filename),0, make_raw_assignment_shim(pSource)))) { ::MessageBox( NULL, "Unable to create source filter", "Error", MB_OK | MB_ICONINFORMATION ); return 0; } /* // original code... // Create a source filter specified by filename ref_ptr<IBaseFilter> pSource; { IBaseFilter* ppSource= NULL; if(FAILED(pGraph->AddSourceFilter(a2w(filename),0,&ppSource))) { ::MessageBox( NULL, "Unable to create source filter", "Error", MB_OK | MB_ICONINFORMATION ); return 0; } pSource.set(ppSource, false); } */ ... Of course, the names can be changed, and some refinements should probably be added. Such as limit it only for initializing an empty (NULL) ref_ptr<>, exceptions etc. What do you think? Adi |
Copyright © 1999-2021 by the D Language Foundation