Boost logo

Boost :

From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-09-13 07:09:53


John Torjo wrote:
>>That is basically what I do already:
>>wrappedfmt() is associated with openclose_formatter;
>>pairfmt() is associated with formatter (using default_nary_traits)
>>containerfmt() is associated with formatter (using
>>default_sequence_traits)
>>etc.
>
>Yes, and that is great!
>But you hold them in the formatob object.

I have this relationship:
   formatob isa FormatObject isa formatter usesa DefaultTraits
   FormatObject hasa FormatObject

>What I'm saying is that (overridable) defaults for each of the above can
>also be kept in the stream object itself.

I understand what you are saying, I am just looking at how to implement it.

>>so you can theoretically use any string type to store the default
>>delimeter values. How do we do the equivalent with ios_base::pword/iword?
>
>That's your job - to come up with a technique for this ;)

:)

>Basically, the library's underlying concept doesn't have to change. This is
>just an extra goodie you can provide.

Sure.

>>openclose_formatter/formatter set their delimeter values to the values
>>provided by the default traits object passed to them. You can then
>>override these defaults by calling format(). How do you tell that the
>>default has been overrided?
>
>It's certainly possible. Internally, in the delim object, you can keep the
>data like this:
>
>template<class value_type> struct val_keeper {
> value_type val;
> bool has_been_set;
> //getter and setter - I assume you get the point
>};

This might be easier if instead of formatter holding DelimeterType objects
for each delimeter, have it store an io::delimeter< CharT > object and have
that responsible for access, thus:

   template< typename CharT >
   class delimeter
   {
      private:
         const CharT * value;
         bool is_set;
      public:
         const CharT * get() const{ return( is_set ? value : ios_base::pword
-> value()); }
         void set( const CharT * v ){ value = v; is_set = true; }
         delimeter(): value( "" ), is_set( false ){}
   };

and

   template< typename CharT >
   class formatter
   {
      public:
         delimeter< CharT > separator; // separator is now a property!
   };

>>The main questions are:
>>[1] how do you store different DelimeterTypes in this mechanism?
>
>Which brings us to ;) :
>I think one type of delimeter is enough (I assume you wholeheartidly
>disagree with this).

I don't wholeheartedly disagree... I am open to persuasion ;)

>This type should be the std::basic_string<underlying_char_type>().

This would still mean that you have one per underlying_char_type, so the
same problem exists although it is now in a smaller problem domain. My main
reason against using std::basic_string as the storage type is performance
(excessive copying of the delimeter values). Also, what about managed
strings in C++/CLI? Don't they require a String^ type, or am I missing
something?

Regards,
Reece

_________________________________________________________________
Get ready for school! Find articles, homework help and more in the Back to
School Guide! http://special.msn.com/network/04backtoschool.armx


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk