|
Boost : |
From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-05-12 14:20:30
Rob Stewart wrote:
>From: John Nagle <nagle_at_[hidden]>
> >
> > STL strings are variable-sized, with no limit. When you
> > add characters, "size()" increases. Should fixed-size
> ^^^^
>I presume you're referring to fixed-capacity strings which can
>have a variable size, right?
yup. The idea is to make it a buffer-overflow safe replacement for C style
character buffers, e.g.:
char buf[ 100 ];
::sprintf( buf, "...", ... );
while allowing it to behave like a basic_string.
> > strings be similar? If the STL string operations are
> > to be meaningful, they have to be.
>
>Only if you want to apply mutating algorithms that modify size.
>IOW, it isn't unreasonable to choose either fixed-size or
>fixed-capacity strings. If the former, then there are no
>mutating algorithms that affect the size. If the latter, the
>size can change, but an exception occurs when trying to exceed
>the capacity.
That's the way I see it, but instead of throwing an exception, the class
simply prevents overrun and fills the available space, e.g.:
char_string< 5 > buf;
buf.copy( "Meine Grosse Welt!" );
std::cout << buf << '\n'; // prints "Mein" (null terminated)
> > In STL strings, "size" doesn't include a trailing null.
> > Using "c_str" can result in expanding the string to add a
> > trailing null. With fixed-size strings, we don't have that
> > option.
> >
> > If c_str is provided, there must always be space
> > for a trailing null. So you can't use char_string
> > when you need a specific fixed length, as for Macintosh
> > 4-character file signatures. Perhaps "boost::array<char>"
> > is the way to go for that sort of thing. Trying to do
> > both null-terminated and non-null-terminated strings
> > in the same class will get ugly.
>
>If the string if fixed-capacity *and* there remains sufficient
>capacity, c_str() can null terminate the buffer. If there isn't
>sufficient remaining capacity, then throw an exception.
>
>IOW, make it a runtime error to fix the capacity too small to
>permit null termination when calling c_str(). That still leaves
>room for things like the 4-character file signature to which you
>referred, and yet prevents buffer overrun, but doesn't require
>foregoing flexibility.
That is a good idea. It will mean keeping track of the string length, but it
does permit both versions without requiring complex internals/semasntics or
seperate classes.
In order to keep interoperability with C style usage (i.e. operator const
char *()), we can have the following:
inline const char_type * c_str()
{
// null-terninate buffer: str[ len ] = char_type( '\0' );
return( str )
}
inilne operator const char *()
{
return( c_str());
}
Regards,
Reece
_________________________________________________________________
Tired of 56k? Get a FREE BT Broadband connection
http://www.msn.co.uk/specials/btbroadband
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk