"Eugene Lazutkin" <[EMAIL PROTECTED]> wrote:
>I have a few comments in no particular order.
>
>1) I cannot imaging someone programming in C++ and using "FILE*s,and file
>descriptors" instead of iostream & Co. You've must be talking about
>incomplete systems like embedded systems, which don't have complete standard
>C++ library. Are there any real life examples for that? How frequent are
>they?
>

That's quite right.  I don't see much use in having a wrapper for FILE*.  File 
descriptors' are a different story.  Two cases that jump to mind are memory 
mapped files and socket descriptors.  In neither case are there general purpose 
cross platform C++ libraries (that I'm aware of) that eliminate any reasonable 
need to deal with file descriptors for these purposes.

The main uses of the library as I see it is to handle two main cases:

1)  Where a programmer needs to access an API (whether it be from the OS or a 
3rd party C API) which uses handle-based resource management and for which not 
suitable C++ wrapper exists.
2)  As an aid in implementing C++ wrapper classes for APIs mentioned in (1).

>2) Windows handles are problem indeed because they are not covered by
>standard libraries. MFC covers it but being a behemoth it is not suitable
>for some applications. ATL is better but it doesn't address handle issue. A
>lot of people and their grandma have created their own home-brewed handle
>wrappers.
>

Yes, one of purposes is to make this easier and to provide a semi-standard 
interface.

>2a) You are not entirely correct in assumption that "Most Windows' handles
>are actually void pointers". For years Microsoft uses so called "strict
>definitions" by default (you have to switch to old mode explicitly). This is
>relevant code from their headers for illustration purposes:
>

[code snipped]

>As you can see HANDLE is void* but almost all other handles declared using
>DECLARE_HANDLE() macro, which makes them of different types. Notable
>exception is HGDIOBJ, which is void* as well. The former was done to
>facilitate inheritance-like relationship between generic GDI handle
>(HGDIOBJ) and specialized GDI handles (HPEN, HBRUSH, HFONT, HRGN, and so on)
>with C compiler.
>

I was unaware that this was now the default.  However, the importance of the 
RAII aspects of smart_handle still stand.

>2b) It appears to me that Windows handles and their profound importance are
>quite unique. I never struggled with something like that on X Window, for
>example. If this is the case, we are talking about platform-specific
>solution. I am not sure Boost is right place for platform-specific
>libraries. Of course, it is possible to make such library
>platform-independent but is it going to be used outside of Windows world?
>

I have little experience with X-Windows, so I can't comment on that.  However, 
there is absolutely *nothing* in the smart_handle library that is platform 
specific.  Just because one of the most obvious cases where it is useful is a 
specific platform, does not make the library itself platform specific.  I find 
it hard to believe that there is no other C API which uses handles for resource 
management that doesn't have a suitable C++ wrapper for every case other than 
Windows.

>3) Necessity to call get() method every time you need to use handle is
>cumbersome. That's why auto_ptr or any other smart pointers define
>operator->() and operator*(). Instead of these operators smart_handle should
>define operator Handle() (where Handle is underlying handle type).
>

Six characters (".get()") doesn't seem cumbersome to me and seems much better 
than a conversion operator which for many reasons is frowned upon.  Note also 
that auto_ptr and the like provide those operators so that they can actually 
act like pointers.  If you want the pointer value itself from an auto_ptr, you 
call get().  Note also that std::string has c_str() rather than operator const 
char*().

>4) Sometimes destruction of handles is more than a simple call to
>one-argument procedure. Real example from Windows, which is encountered
>frequently:
>
>HDC hDC = GetDC(hWindow);
>// do some drawing...
>ReleaseDC( hWindow, hDC );
>
>In this example destruction (releasing) involves some kind of context
>(window handle). Apparently it is not handled by proposed library.
>

Thanks for this example.  I had not considered cases like this and will think 
more about it.

>5) While I frequently needed scoped handles, I never encountered real need
>to have "weak" handles and reference-counted handles. When I wanted to do
>something like that, I created object, which was handled by smart pointer of
>some kind. Admittedly this is not light weight solution but it was never a
>bottleneck in my projects. Scoped handles are used extensively a should be
>as light weight as possible.
>

I agree that in many cases scoped is more useful.  However, it was fairly 
trivial to do shared and weak, so I figured why not?  Also, shared_handles will 
work in stl containers while scoped_handles will not.

>Thanks,
>
>Eugene
>
>PS: Yeah, I am one of those poor guys, who wrote Windows handle wrappers for
>themselves. If you want to take a look, I can send you a file.
>

I'd love to look at whatever you've got.  You can send it to the no spam email 
below if you'd like.

Thanks for your comments,

John

john at illura dot com


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to