Boost logo

Boost :

Subject: Re: [boost] [string] proposal
From: Christian Holmquist (c.holmquist_at_[hidden])
Date: 2011-01-24 16:37:24


On 24 January 2011 08:20, Dean Michael Berris <mikhailberis_at_[hidden]>wrote:

> On Mon, Jan 24, 2011 at 9:51 PM, Stewart, Robert <Robert.Stewart_at_[hidden]>
> wrote:
> > Dean Michael Berris wrote:
> >> On Mon, Jan 24, 2011 at 7:50 PM, Artyom <artyomtnk_at_[hidden]> wrote:
> >> >> From: Dave Abrahams <dave_at_[hidden]>
> >>
> >> >> Who says we need a c_str()?
> >> >
> >> > Almost everybody who uses any kind of API that does not has
> >> > direct uses of this string and this is as almost every API
> >> > around...
> >>
> >> Right, but what's keeping that person from creating an std::string
> >> from this hypothetical `boost::string` if they really need a c_str()?
> >
> > Do you mean besides poorer performance and greater complexity of use?
> >
>
>
>
Isn't it too early to discuss optimization tricks, before the interface has
started to take form?
I looked at the string_proposal, and if Boost is going for a distinct utf8
type (in whatever form), I
think it should be built on something not directly tied to utf8.

namespace boost
{
  template<class Encoding>
  class string
  {
    public:

     typedef some_iterator_base<Encoding> char/code_point/character_iterator
      // Disclaimer: I'm not familiar enough with unicode terminology to
know what kind of iterators needed, and how they relate
     // to properties of the encoding.

      template<class Iterator, class OtherEncoding>
      string(Iterator first, Iterator last, OtherEncoding);
      // Add other convenience constructors from ranges here, taking the
encoding as separate parameter..

      template<class OtherEncoding>
      string(string<OtherEncoding> const&);

     string& operator=(string& const) // Only allow assignment of same
encoding allowed.

     template<class Iterator, class OtherEncoding>
     void assign(Iterator first, Iterator last, OtherEncoding);

      template<class OtherEncoding>
      std::string to_string(OtherEncoding const&) const;
  }
}

usage:
namespace encoding = boost::string_encoding; // Or something cleaner
namespace
boost::string<encoding::utf8> s_utf("Hello world", encoding::latin1()));
boost::string<encoding::latin1> s_latin1(s_utf8);

FILE* f = boost::fopen(boost::string<boost::string_encoding::utf8> const&);

Boost could have as policy that interfaces should take boost::utf8 and not
bother with implementing any other encoding (but still support updating the
Encoding concept, so that other encodings can be expressed).
In future, a theoretical layer built upon proposed Boost.Locale could expose
more encodings to use with boost::string.

/me also ducks and covers (:

- Christian


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