$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2006-01-31 12:30:21
>> Second use for me is to have a basic_string compatible buffer to use in shared 
>> memory/IPC.
>>
>> struct commandlineargs {
>>   boost::fixed_string<20> arg1;
>>   boost::filesystem::basic_path<boost::fixed_string<256> > path1
>> };
> 
> Isn't that what the allocator argument to basic_string is for?
I agree with Dave, I don't see the need of a fixed string for IPC: a 
fixed_buffer_allocator for basic_string should do the job. You have two 
possibilities:
-> Use an allocator that has the buffer as member. The only drawback is 
that the string will create a temporary default constructed allocator 
and will assign it to the basic_string's member allocator. So you have a 
extra stack when constructing the basic_string. And the allocators have 
private, per-instance memory, and can't be swapped (like current Howard 
Hinnant's proposal says), so they are stateful allocators (which I think 
are not standard).
-> Use an allocator that holds the pointer and size of a buffer. This is 
more flexible but you can't freely pass the string because the lifetime 
of the buffer must be the same as the lifetime of the basic_string. But 
sometimes this could be very useful and you can swap the strings.
char buffer [100];
c_buffer_allocator a (buffer, 100);
basic_string<char, std::char_traits<char>, a> str (a);
In both cases when trying to reallocate memory, the allocator would 
throw an exception, so we have buffer protection, and all basic_string uses.
-> Another alternative to work with fixed buffers is to create a buffer 
formatting iostream. For example, in Boost candidate Shmem you have 
bufferstream classes:
basic_bufferstream<char, std::char_traits<char> > bufstream;
bufferstream mybufstream(my_cstring, 100*5);
bufstream << int(1) << "text" << std::ends;
If you read past-end the buffer, that will trigger eofbit and if you try 
to right past-end you will have badbit activated. You can activate also 
exceptions, like with other iostreams.
Regards,
Ion