|
Boost : |
From: Jeff Garland (jeff_at_[hidden])
Date: 2006-05-01 00:28:38
On Mon, 01 May 2006 10:25:48 +0700, Oleg Abrosimov wrote
> Hello, boost
>
> This is an idea of project for Google SoC2006 that I want to participate.
> The library is called 'string_cvt' or string conversions, it
> solves the problem of converting type to string and string to type
> with minimal runtime and syntactical overhead.
>
> It is a simple "call for interest" mail.
Hi Oleg -
Let me just say I believe there is a clear interest in this area, so I
encourage you to submit an soc proposal. A few comments inline below:
> Idea for this lib was inspired by recent discussion on boost developers
> mailing list. The question under discussion was:
> Is lexical_cast<> tool good enough for TR2 or not?
>
> A proponents of lexical_cast<> have a point that the main
> advantage of lexical_cast<> component is its usage
> simplicity and symmetry (angle braces are used in both cases):
> int i = lexical_cast<int>("1");
> string s = lexical_cast<string>(1);
>
> Additionally, it looks like built-in casts, and it is considered as
> a very cool thing.
>
> On the other side, opponents of lexical_cast<> wants more
> functionality that doesn't fit into simple cast-like usage like:
>
> The requirements table.
> 1) controlling conversions via facets (locales)
> 2) full power of iostreams in simple interface.
> All functionality accessible with iostreams
> (through manipulators) should be accessible.
> 3) functor adapters to use with std algorithms
> 4) error handling and reporting. (what kind of error occurred?)
> * optionally report failing without exceptions raising
> 5) best performance, especially for built-in types and for use in loops
>
> The "Lexical Conversion Library Proposal for TR2" by Kevlin Henney
> and Beman Dawes states, that: "The lexical_cast function template
> offers a convenient and consistent form for supporting common
> conversions to and from arbitrary types when they are represented as
> text. The simplification it offers is in expression-level
> convenience for such conversions. For more involved conversions,
> such as where precision or formatting need tighter control than is
> offered by the default behavior of lexical_cast, the conventional
> stringstream approach is recommended."
I presume this is n1973?
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n1973.html
> It is clear that lexical_cast is not intended to address (1-4)
> points in the list above, and even (5). For optimizing conversions
> in loops you'll need to resort to stringstreams again.
>
> I believe, that stringstreams are not the right tool for daily
> string conversions job. We need a special and fully featured
> solution, which addresses all issues in the Requirements table
> above. My dream is that one has no need to fallback to C-style
> solutions or to stringstreams anymore, just one consistent interface
> for all string conversion needs. This proposal for Google SoC
> project is an attempt to develop such a solution. The final
> ambitious goal of this project is to make boost::lexical_cast<>
> obsolete and replace it in TR2 with a new proposal. Regardless of
> SoC, Im going to develop such a library for boost, but the
> participation in the Google SoC is important because otherwise it
> would be hard to manage enough time to finish this library before
> the deadline for TR2 in October.
One other proposal you should be aware of is Pete Becker's n1982 for simple
numeric to string conversions:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n1982.html
Part of the synopsis:
int stoi(string& str, int base = 10);
long stol(string& str, int base = 10);
unsigned long stoul(string& str, int base = 10);
long long stoll(string& str, int base = 10);
unsigned long long stoull(string& str, int base = 10);
float stof(string& str);
double stod(string& str);
long double stold(string& str);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(long double val);
//...snip more....
wstring to_wstring(long long val);
wstring to_wstring(unsigned long long val);
wstring to_wstring(long double val);
While this is a very C like proposal it fills a basic gap in C++ for basic,
high performance, (w)string to number conversions. My understanding is this
the committee is pretty fond of this proposal -- perhaps someone that was in
Berlin can say more (Beman, Howard?).
> As a result of this project we would have not only fully documented
> and tested library for string conversions, but full comparative
> performance analysis would be made to ensure that there is no more
> any need to fallback to some other solution.
>
> There are short examples of intended usage of this library (for
> those who are too busy to read the full proposals text)
>
> // simple initialization usage:
> string s = string_from(1);
> int i = from_string(1);
>
> // embedded in expression usage:
> double d = 2 + (double)from_string(1);
I think having a C-style cast is a no no. I assume:
double d = 2 + static_cast<double>(from_string(1));
would work as well?
>...snip lots of good details...
One thing I didn't see address in your proposal is how 'user defined types'
can be handled. So, for example, with lexical cast I can do this:
using namespace boost::gregorian;
date d(2006,May, 1);
std::string ds = lexical_cast<std::string>(d);
and this
std::string ds("2006-May-01");
date d = lexical_cast<date>(ds);
This works because date has a defined operator<< and operator>>. You would
need to show how this would be done in your proposal to really compete with
lexical cast. Also note that with updates to the date-time global facet, the
format of the date can be changed around, localized etc.
> Till now I have a minimal working implementation of basic concepts proposed.
>
> Possible mentors for this project could be authors of the Lexical
> Conversion Library Proposal for TR2 proposal - Kevlin Henney and/or
> Beman Dawes.
I'm not sure Kevlin or Beman is available, but I'm certain we can find a good
mentor if the proposal is accepted.
Jeff
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk