Boost logo

Boost :

From: Jeff Garland (jeff_at_[hidden])
Date: 2007-11-11 16:34:57


Sebastian Redl wrote:
> Robert Kawulak wrote:
>> Don't worry, I am planning to finish this. But looking at the (quite crowded)
>> review queue I suppose there is no hurry... ;-)
>>
> I think as it is now, if you can find yourself a review manager, you
> could effectively jump most of the queue.
>
> Just saying ...

I'm glad this library is moving toward prime time. Looking over the docs, it
looks pretty good -- pretty certain I could replace my date-time
implementation with these. I have a few comments below. Anyway, I'm willing
to be the review manager if that helps.

I'm a little concerned with the dynamic changeability of the checking policy
on bounded. I think that design decision will lead to function call overhead
not present in the original implementation...even for bounded_int where the
constraints can all be inline and fixed at compile time. I'd rather have 2
types if need be to allow maximum efficiency for the static cases.

Couple thoughts on the docs. I didn't see Christopher Diggins acknowledged
anywhere. He also took the date-time ideas and expanded them -- writing an
article for C/C++ Users Journal. Here's some links:

http://www.cdiggins.com/constrained_value.hpp
http://www.artima.com/weblogs/viewpost.jsp?thread=79470

Second thing is that it would be nice to have tutorial style docs to walk
someone thru use of writing a custom constraints (ok there's a simple one
there), but also how to replace the provided exceptions with custom exceptions
-- this isn't clear in the docs. I need to do custom exceptions in date-time
-- the code there looks like:

   //! Exception type for gregorian year
   struct bad_year : public std::out_of_range
   {
     bad_year() :
       std::out_of_range(std::string("Year is out of valid range: 1400..10000"))
     {}
   };
   //! Policy class that declares error handling gregorian year type
   typedef CV::simple_exception_policy<unsigned short, 1400, 10000, bad_year>
greg_year_policies;

Anyway the docs should describe how to do this.

I also may have another contribution to this library in the future. I've
written a constrained_string type which provides similar capabilities for
strings. A typical use case is to only allow construction with a fixed set of
strings -- basically like an enum:

class image_string_policy :
   public string_set_policy<std::string, image_string_policy>
{
  public:

   static set_type* init_set()
   {
     set_type* s = new set_type();
     s->insert("png");
     s->insert("jpg");
     s->insert("jpeg");
     s->insert("tiff");
     return s;
   }
};

//must construct with png, jpg, jpeg or tiff -- null is invalid
typedef constrained_string<image_string_policy, std::string> image_string_type;

//must construct with png, jpg, jpeg or tiff -- null ok
typedef constrained_string_with_null<image_string_policy, std::string>
image_string_type_with_null;

image_string_type is("jpg"); //ok
image_string_type is2("garbage"); //exception

Another form allows fancy regex checking:

class digit_string_policy :
   public regex_policy<std::string, digit_string_policy>
{
  public:

   static const regex_type& get_regex()
   {
     static const regex_type pattern("\\d{4}");
     return pattern;
   }
};

typedef constrained_string<digit_string_policy, std::string> digit_string_type;

digit_string_type ds("1234"); //ok
digit_string_type ds2("12"); //exception-- four digits required

Jeff


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