As anticipated, winstl::basic_findfile_sequence, which is described in detail in Extended STL, volume 1, now defines, and responds to, the member constant throwOnAccessFailure. In the case of an access failure an instance of winstl::access_exception is thrown.
This allows for better response in cases where access may be denied.
Musings of an STL-extension library designer (who's renowned for producing high-quality software with low-quality documentation).
Showing posts with label Extended STL. Show all posts
Showing posts with label Extended STL. Show all posts
Tuesday, January 12, 2010
Saturday, January 24, 2009
memcpy() / bcopy() / strncpy(): char_copy()
Well, as you've probably already noticed, I've started removing dependencies on the so-called "unsafe" string library functions from all my open-source libraries.
As part of this continuing (and somewhat life-sapping) activity, I'm moving through the STLSoft libraries. The latest release incorporates changes to the important winstl::basic_findfile_sequence class template, which is an STL extension over the Windows FindFile API.
This makes use of a new facility that's been added to the winstl::system_traits class templates: char_copy(). This (static) function is effectively a typed memcpy().
class winstl::system_traits<char>
{
. . .
public:
char* char_copy(char* dest, char const* src, size_t n);
}
class winstl::system_traits<wchar_t>
{
. . .
public:
wchar_t* char_copy(wchar_t* dest, wchar_t const* src, size_t n);
}
It copies exactly the number of characters specified, with no checks on the actual length of src.
The modest benefits are that it is a bit type-safe, and that you don't have to keep having to remember sizeof(char_type) * n.
I'm not totally struck on the name, and did consider borrowing other names. I liked BSD's bcopy() (to mean block copy), but it's too likely that some code somewhere #defines it to memcpy().
I'll gradually filter char_copy() throughout the rest of WinSTL, and then through UNIXSTL, as I work my way through the thankless task of getting "unsafe"-free. Ho hum.
As part of this continuing (and somewhat life-sapping) activity, I'm moving through the STLSoft libraries. The latest release incorporates changes to the important winstl::basic_findfile_sequence class template, which is an STL extension over the Windows FindFile API.
This makes use of a new facility that's been added to the winstl::system_traits class templates: char_copy(). This (static) function is effectively a typed memcpy().
class winstl::system_traits<char>
{
. . .
public:
char* char_copy(char* dest, char const* src, size_t n);
}
class winstl::system_traits<wchar_t>
{
. . .
public:
wchar_t* char_copy(wchar_t* dest, wchar_t const* src, size_t n);
}
It copies exactly the number of characters specified, with no checks on the actual length of src.
The modest benefits are that it is a bit type-safe, and that you don't have to keep having to remember sizeof(char_type) * n.
I'm not totally struck on the name, and did consider borrowing other names. I liked BSD's bcopy() (to mean block copy), but it's too likely that some code somewhere #defines it to memcpy().
I'll gradually filter char_copy() throughout the rest of WinSTL, and then through UNIXSTL, as I work my way through the thankless task of getting "unsafe"-free. Ho hum.
Friday, January 2, 2009
Working with other libraries, part 3: use consistent conventions for member types
Ever get confused by the names of member variables/types/functions of C++ class templates?
Boost.Format's basic_format class template defines five public and two private member types, using a mix of four different naming conventions!
[an extract from boost/format/format_class.hpp]
// in namespace boost
template <class Ch, class Tr, class Alloc>
class basic_format
{
private:
typedef typename io::CompatTraits<Tr>::compatible_type compat_traits;
typedef io::detail::stream_format_state<Ch, Tr> stream_format_state;
public:
typedef Ch CharT;
typedef std::basic_string<Ch, Tr, Alloc> string_type;
typedef typename string_type::size_type size_type;
typedef io::detail::format_item<Ch, Tr, Alloc> format_item_t;
typedef io::basic_altstringbuf<Ch, Tr, Alloc> internal_streambuf_t;
In Extended STL, volume 1: Collections and Iterators I recommend the use of the following naming convention for member types:
I've been using this for many years without a blip. I can read my code, even some years later, and understand what's a type and what isn't and also, importantly, which types are for consumption in the outside world and which are internal to the component. Q.E.D.
Boost.Format's basic_format class template defines five public and two private member types, using a mix of four different naming conventions!
[an extract from boost/format/format_class.hpp]
// in namespace boost
template <class Ch, class Tr, class Alloc>
class basic_format
{
private:
typedef typename io::CompatTraits<Tr>::compatible_type compat_traits;
typedef io::detail::stream_format_state<Ch, Tr> stream_format_state;
public:
typedef Ch CharT;
typedef std::basic_string<Ch, Tr, Alloc> string_type;
typedef typename string_type::size_type size_type;
typedef io::detail::format_item<Ch, Tr, Alloc> format_item_t;
typedef io::basic_altstringbuf<Ch, Tr, Alloc> internal_streambuf_t;
In Extended STL, volume 1: Collections and Iterators I recommend the use of the following naming convention for member types:
- For public member types that share names with standard components that have the same logical purpose, follow the standard convention and use the standard name. An example would be iterator.
- For public member types that are not covered by clause 1, use the _type suffix. An example would be char_type.
- For private member types, use the _type_ suffix. An example would be compat_traits_type_.
- For public API (non-member) types use the _t suffix. An example would be pan_char_t.
- For non-public/implementation API (non-member) types use the _t_ suffix. An example would be b64ErrorString_t_.
I've been using this for many years without a blip. I can read my code, even some years later, and understand what's a type and what isn't and also, importantly, which types are for consumption in the outside world and which are internal to the component. Q.E.D.
Subscribe to:
Posts (Atom)