Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
"Joel de Guzman" <[EMAIL PROTECTED]> writes:

> - Original Message - 
> From: "Aleksey Gurtovoy" <[EMAIL PROTECTED]>
>
>> My current understanding (which, admittedly, is not backed up by a
>> real-world experience) is that if you care about higher-orderness of your
>> generic algorithms, a preferred implementation construct for those
>> algorithms is not a function template, but a static _function object_ (a
>> technique used in FC++):
>> 
>> struct my_function_
>> {
>> template< typename U >
>> void operator()(std::string const& text, U)
>> {
>> // ...
>> }
>> 
>> } my_function; // here!
>> 
>> 
>> For ordinary uses, the above will act just like a plain function template
>> (minus ADL/explicit template arguments specification):
>> 
>> my_function("text", int());
>> 
>> and it will also allow one to do something like this:
>> 
>> std::string text("text");
>> mpl::for_each< my_types >(boost::bind(my_function, text, _1));
>
> This technique is adopted by Phoenix. With this, you can even do 
> (as suggested by Joel Young):
>
> -  \ \
> double  -  /\  f .   /\   x.  f(f x)
> - /  \  /  \
>
> struct square_ {
>
> template 
> struct result { typedef X type; };
>
> template 
> X operator()(X x)
> {
> return x * x;
> }
> };

This is similar to my "universal identity" suggestion from many months
back.  However, "result" should be "apply" to make it an MPL
metafunction class .

Hum, that result template looks like identity, and not square. Am I
missing something?  I'd have thought:

template 
struct result :  mpl::times {};

> function square;
>
> template 
> struct ffx {
>
> template 
> struct result { typedef X type; };

Mighty confused.  Not

template 
struct result :  mpl::apply::type> {};

??

If not, what's the point of "result"?

> PS> Jaakko and I are working on the LL/Phoenix merger.

Yay!  What about my tuples question?

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Problem with regression tests

2003-01-23 Thread Matthias Troyer
Hi,

I have now run the regression tests on a Cray SV1 but it seems there is 
still a problem in the postprocessing stage. I get output like:

generating html tables:
Using /u/ph/troyer/boost/status/bin/bind_test.test to determine 
compilers
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/bind_test.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/mem_fn_test.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/mem_fn_void_test.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/mem_fn_derived_test.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/config_info.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/array1.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/array2.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/array3.test/cray/debug"
Missing jam_log.xml in target 
"/u/ph/troyer/boost/status/bin/array4.test/cray/debug"
...

Can anyone help me and point me to a location where I might start 
looking for the problem?

Matthias

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost


Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Joel de Guzman
- Original Message - 
From: "Aleksey Gurtovoy" <[EMAIL PROTECTED]>



> My current understanding (which, admittedly, is not backed up by a
> real-world experience) is that if you care about higher-orderness of your
> generic algorithms, a preferred implementation construct for those
> algorithms is not a function template, but a static _function object_ (a
> technique used in FC++):
> 
> struct my_function_
> {
> template< typename U >
> void operator()(std::string const& text, U)
> {
> // ...
> }
> 
> } my_function; // here!
> 
> 
> For ordinary uses, the above will act just like a plain function template
> (minus ADL/explicit template arguments specification):
> 
> my_function("text", int());
> 
> and it will also allow one to do something like this:
> 
> std::string text("text");
> mpl::for_each< my_types >(boost::bind(my_function, text, _1));

Here's the Phoenix version:

struct my_function_
{

template 
struct result { typedef void type; };

template< typename U >
void operator()(std::string const& text, U)
{
// ...
}

};

function my_function; // here!

Then:

mpl::for_each< my_types >(my_function(text, _1));

Regards,
Joel de Guzman
[EMAIL PROTECTED]
http://www.boost-consulting.com






___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] MPL::void_t

2003-01-23 Thread Joel de Guzman
Hi,

Question why is mpl::void_t an incomplete type? Sometimes I need
to instantiate it. For example to signal a zero arity functor call:

typename actor_result >::type
operator()() const
{
return this->eval(void_t());
}

template 
typename actor_result >::type
operator()(T0& a0) const
{
return this->eval(a0);
}

Of course I can do it differently, but it wouldn't be as clean and
generic as above. Thoughts?

Joel de Guzman
[EMAIL PROTECTED]
http://www.boost-consulting.com


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: undo library

2003-01-23 Thread Ihsan Ali Al Darhi
Can I use this library to implement multiple undo/redo in GUI applications
under Windows? For example in a word processor.


Mohammed
- Original Message -
From: "Pavel Vozenilek" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, January 24, 2003 1:15 AM
Subject: [boost] Re: Re: undo library


>
> "Steven Mauceri" <[EMAIL PROTECTED]> wrote in message
> 000f01c2c301$fca17ae0$[EMAIL PROTECTED]">news:000f01c2c301$fca17ae0$[EMAIL PROTECTED]...
> > Hi Andreas,
> >
> [snip]
> > Some things ive come across include:
> >
> [snip]
>
> Undo library may also provide features like:
> - user friendly description of what is going to be undoed/redoed,
> - ability to keep only N last undo steps in memory and save rest on disk
> (maybe with help of an serialisation library),
> - ability to group multiple undo commands to one (e.g. moves),
> - ability to generate 'change log' for any given time period.
>
> Most of it may be implemented by specialised command manager.
>
> /Pavel
>
>
>
> ___
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost
___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Joel de Guzman
- Original Message - 
From: "Aleksey Gurtovoy" <[EMAIL PROTECTED]>

> My current understanding (which, admittedly, is not backed up by a
> real-world experience) is that if you care about higher-orderness of your
> generic algorithms, a preferred implementation construct for those
> algorithms is not a function template, but a static _function object_ (a
> technique used in FC++):
> 
> struct my_function_
> {
> template< typename U >
> void operator()(std::string const& text, U)
> {
> // ...
> }
> 
> } my_function; // here!
> 
> 
> For ordinary uses, the above will act just like a plain function template
> (minus ADL/explicit template arguments specification):
> 
> my_function("text", int());
> 
> and it will also allow one to do something like this:
> 
> std::string text("text");
> mpl::for_each< my_types >(boost::bind(my_function, text, _1));

This technique is adopted by Phoenix. With this, you can even do 
(as suggested by Joel Young):

-  \ \
double  -  /\  f .   /\   x.  f(f x)
- /  \  /  \

struct square_ {

template 
struct result { typedef X type; };

template 
X operator()(X x)
{
return x * x;
}
};

function square;

template 
struct ffx {

template 
struct result { typedef X type; };

ffx(F f_) : f(f_) {}

template 
X operator()(X x)
{
return f(f(x));
}

F f;
};

template 
function >
doub(function f)
{
return function >(f.op);
}

int
main()
{
cout << doub(square)(5.0)() << endl;
cout << doub(doub(square))(5.0)() << endl;
cout << doub(doub(doub(square)))(5.0)() << endl;
return 0;
}

Cheers,
Joel de Guzman
[EMAIL PROTECTED]
http://www.boost-consulting.com

PS> Jaakko and I are working on the LL/Phoenix merger.





___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



RE: [boost] Re: MPL usage for code generation

2003-01-23 Thread Aleksey Gurtovoy
David Abrahams wrote:
> Terje Slettebø <[EMAIL PROTECTED]> writes:
> > Perhaps it might be possible to do some compile-time/run-time lambda
> > (similar to Boost.Lambda for runtime, and MPL's lambda), so you 
> > could do something like:
> >
> > mpl::for_each(my_function<_>(s));
> >
> > It would then transform the function call "my_function<_>(s)" into 
> > an instantiated function object of the kind suitable for 
> > mpl::for_each.
> 
> I'm afraid that particular syntax won't work for this particular case,
> though.  If my_function is a function template, my_function<_> is a
> function, and my_function<_>(s) calls that function.
> 
> Since there are no (function template) template parameters, only
> (class template) template parameters, there doesn't appear to be any
> way to make this one particularly easy except by using the
> preprocessor to define some kind of function object.
> 
> It appears to be just bad luck that higher order functional
> programming with function templates is impossible in C++.

My current understanding (which, admittedly, is not backed up by a
real-world experience) is that if you care about higher-orderness of your
generic algorithms, a preferred implementation construct for those
algorithms is not a function template, but a static _function object_ (a
technique used in FC++):

struct my_function_
{
template< typename U >
void operator()(std::string const& text, U)
{
// ...
}

} my_function; // here!


For ordinary uses, the above will act just like a plain function template
(minus ADL/explicit template arguments specification):

my_function("text", int());

and it will also allow one to do something like this:

std::string text("text");
mpl::for_each< my_types >(boost::bind(my_function, text, _1));


Aleksey
___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: Re: Re: Review results: Optional library

2003-01-23 Thread Beman Dawes
At 02:21 PM 1/23/2003, Fernando Cacciola wrote:
>
>"William E. Kempf" <[EMAIL PROTECTED]> wrote in message
>[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
>> Fernando Cacciola said:
>> > "William E. Kempf" <[EMAIL PROTECTED]> wrote in message
>> >> Fernando Cacciola said:
>> >>  However, shouldn't you be using "run" instead of
>> >> "unit-test" in the Jamfile?
>> >>
>> > Yes :-)  I was looking at the wrong examples.
>> >
>> > Fixed now. (could you re-test it?)
>>
>> $ bjam
>> Jamfile: line 25: syntax error at keyword ;
>> Jamfile: line 25: syntax error at keyword ;
>> Jamfile: line 26: syntax error at keyword }
>> Jamfile: line 26: syntax error at keyword }
>> found 8 targets...
>>
>It looks like the syntax for the compile-fail (plus the ) is
>wrong...
>I've removed the fail cases altogether until I can test it myself so I
>don't
>abuse anymore of your time.
>It runs only the ordinary test now
>It should work I think.

Yes, works here.  I've added optional to the status/Jamfile.

Always keep in mind that the jam language is whitespace sensitive. I can't 
tell you how many times that caught me at first, although I got used to it 
after awhile.

--Beman


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost


[boost] Re: MPL usage for code generation

2003-01-23 Thread Hugo Duncan
On Wed, 22 Jan 2003 16:25:40 -0800, "Andrei Alexandrescu" <[EMAIL PROTECTED]> 
wrote:
> 
> inline void do_my_function(string&, void_) {}
> 
> template 
> inline void do_my_function(string& s, Lst lst)
> {
> my_function::type>(s);
> do_my_function(s, pop_front::type());
> }
> 
> do_my_function(s, my_list());
> 

This is interesting as it also gives run-time control of how much of the list
is iterated over.

eg.

template 
inline void do_my_function(string& s, Lst lst)
{
   if (!my_function::type>(s))
  do_my_function(s, pop_front::type());
}





___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] RE: math constant - generic function circle_area example.

2003-01-23 Thread Joerg Walter
Hi Paul,

you wrote:

> > I've been looking into an earlier version of the proposed math constants
> > before and asked myself how to implement a generic function like
> >
> > template
> > T circle_area (const T &radius) {
> > return math_constants::pi * radius * radius;
> > }
> >
> > How should this be done?
> >
> > Thanks,
> >
> > Joerg
>
> Attached is an example using Michael Kenniston's Kunning Function
constants.
>
> Briefly
>
> template 
> T circle_area(const T& radius)
> {
>   // Usage example: circle_area( 2.) // Explicit type double.
>   // or circle_area(2.F) // Implicit type float.
> return boost::math::constant< T, boost::math::pi_tag >() * radius *
radius;
> }

OK. I've tried to compile this with GCC 3.2.1 and after applying some
remedies like


#ifdef LATER
  // Define constant is namespaces to hold three builtin floating-point
representations.
  namespace float_constants
  {
   constant< float, pi_tag > const pi;
  }
  namespace double_constants
  {
   constant< double, pi_tag > const pi;
  }
  namespace long_double_constants
  {
   constant< long double, pi_tag > const pi;
  }
#endif


it compiled and executed giving the expected results. How is this solution
related to your latest (Dec. 12) upload at groups.yahoo.com/group/boost?

> It compiles with MSVC 7.0 (but not 6 - see MK's original example for why
not).
> (long double == double for MSVC, so long double not fully
testable/useful).
>
> It seems to do the trick, without too many surprises.  I have displayed
the
> output using the 17 significant digits for double so one can see the
difference
> between a float pi 3.1415927410125732 and a double pi 3.1415926535897931
(even
> though only 9 are really significant for float).
>
> cout << "circle_area(1.) = "  << circle_area(1.) << endl; //
> Explicit type float.
> cout << "circle_area(1.) = "  << circle_area(1.) << endl;
//
> Explicit type double.
> cout << "circle_area(1.F) = "  << circle_area(1.F) << endl; // Implicit
type
> float.
> cout << "circle_area(1.) = "  << circle_area(1.) << endl; // Implicit type
> double.
> cout << "circle_area(1.L) = "  << circle_area(1.L) << endl; // implicit
type
> long double.
> cout << "circle_area(1.F) = "  << circle_area(1.F) <<
endl; //
> Explicit over-rides implicit.
>
> And silly types like int fail helpfully.
>   // cout << "circle_area(1) = "  << circle_area(1)<< endl; // Implicit
int -
> does not link!
>   // cout << "circle_area(1.) = "  << circle_area(1.)<< endl; //
> Explicit int - does not compile!
>
> Output is
>
> Test test_circle_area.cpp Thu Jan 23 00:06:28 2003
> float pi  = 3.14159274
> double pi = 3.1415926535897931
> float pi  = 3.1415927410125732
> circle_area(1.) = 3.1415927410125732
> circle_area(1.) = 3.1415926535897931
> circle_area(1.F) = 3.1415927410125732
> circle_area(1.) = 3.1415926535897931
> circle_area(1.L) = 3.1415926535897931
> circle_area(1.F) = 3.1415926535897931
> circle_area(1.) = 3.1415926535897931
> circle_area(2.) = 12.566370964050293
> circle_area(2.) = 12.566370614359172
> circle_area(2.F) = 12.566370964050293
> circle_area(2.) = 12.566370614359172
> circle_area(2.L) = 12.566370614359172
> circle_area(2.F) = 12.566370614359172
> boost::math::constant< float, boost::math::pi_tag >() 3.1415927410125732
>
> I haven't looked at any assembler to check on efficiency, but believe/hope
from
> previous examples that it will be optimal if inlined.
>
> Does this look sensible/useful?

Only if I learn to see the relation to your latest upload (which I'm
assuming your review request is related to).

Best,

Joerg



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: undo library

2003-01-23 Thread Pavel Vozenilek

"Andrei Alexandrescu" <[EMAIL PROTECTED]> wrote in message
b0pu01$bqd$[EMAIL PROTECTED]">news:b0pu01$bqd$[EMAIL PROTECTED]...
> Al Stevens has an article in a past DDJ about a generic undo/redo library,
> can anyone dig it out? I recall it was interesting.
>
Can be purchased here: https://www.sdmediagroup.com/secure/?sid=954
and followup here: https://www.sdmediagroup.com/secure/?sid=914

/Pavel



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: undo library

2003-01-23 Thread Andrei Alexandrescu
Al Stevens has an article in a past DDJ about a generic undo/redo library,
can anyone dig it out? I recall it was interesting.

Andrei



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] ublas CVS commit

2003-01-23 Thread Joerg Walter
Hi all,

I've just committed my current ublas version to Boost CVS. Many thanks this
time namely to John Maddock for his Borland related fixes (really a big
patch) and to Alexei Novakov for his sparse matrix related work.

Best,

Joerg

P.S.: I had to touch status/Jamfile once again. I've hopefully destroyed
nothing ;-(

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



RE: [boost] Re: Named Pairs

2003-01-23 Thread Rozental, Gennadiy
> > Look on MPL example for inherit_linear. It may have what you need.
> 
> Well, as I said, I'm new... I can find mpl documentation, but searches
> for inherit_linear came up with nothing.  

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost/boost/libs/mpl/example/
inherit_linearly.cpp?rev=1.1&content-type=text/vnd.viewcvs-markup

In the above example terms, what you want would look like:
typedef mpl::int_c<0> Cash;
typedef mpl::int_c<0> Name;

field( foobar, Cash() ) = 32.2;
field( foobar, Name() ) = "Fred";

IOW, this or another way implemented: tuples are your friends. Look onto
boost::tuple lib, that supply full featured tuples.

Gennadiy.
___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Named Pairs

2003-01-23 Thread Jason House


"Rozental, Gennadiy" wrote:
> 
> First of all there are several glitches here:
>  I am not sure that you allowed to use template parameter for defining
> partial specialization.

Well, is it allowed?  I am new to generic programming stuff, so forgive
any stupid comments I make...  If I remember right, a templated
definition is only evaluated for a specific instance... I'd think that
when it is read for an instance, that a given template paramater should
then be well defined, and that specialization using a template parameter
shouldn't be a problem or at least conceptually... I can definitely
see it being an odd case for a compiler.


> Even if above class definition is allowed foobar.var will be invalud
> cause var is a type name. So basically what you are doing is unusable.

Ok, some updated code for the class definition, hopefully it will make
more sense.  Something like this didn't compile as well in visual
studio, so I didn't post that code.

template 
class named_pair: pair<_T1,_T2>{
  public:

  template 
  void var();

  _T1& var<_Name1>() {return First};   //VC6 dislikes these 2 lines
  _T2& var<_Name2>() {return Second};  //(different return type)
};

enum{  Cash,  Name  };

void main(int argc, char *argv[]){
  named_pair foobar;

  foobar.var() = 32.2;
  foobar.var() = "Fred";
}

> Look on MPL example for inherit_linear. It may have what you need.

Well, as I said, I'm new... I can find mpl documentation, but searches
for inherit_linear came up with nothing.  

Maybe I should try and make my goal clearer.  I wanted to be able to
define a collection of variables for use with STL that is as simple to
define as a struct.  The difference being that all the useful operators
are defined...  comparisons, assignments, etc...

The associative type list looks like it does exactly what I wanted, as
far as having a name to associate with retrieval of a specific
variable.  But it lacks the nice default copy constructor and less than
operator.  

I assume that the associative list is only a list at compile time?  Does
it compile to efficient code?  If so, a simple wrapper around it could
do what I wanted, and still retain whatever other special features it
has.

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: [jamboost] Patch for jam bug on Cray

2003-01-23 Thread Matthias Troyer

On Wednesday, January 22, 2003, at 07:56 PM, Matthias Troyer wrote:


Dear Boost Jamers,

Our local Cray adminstrators (Bruno Loepfe from ETH and Olivier Byrde
from Cray)  found a bug in the boost jam sources. it is in the file
hash.c:


 keyval = keyval * 2147059363 + *b++;


Besides the bug fix I posted before, our Cray system administrator 
warned me that there are (were) machines which trap integer overflow, 
and where above code would not work. He proposed to use a hash function 
employing exclusive or operations instead. In contrast to fixing the 
bug for which I sent the patch, this is s however definitively not an 
urgent problem. It should be kept in mind however in case that we ever 
encounter a modern machine trapping integer overflows.

Matthias

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost


[boost] Re: Re: undo library

2003-01-23 Thread Pavel Vozenilek

"Steven Mauceri" <[EMAIL PROTECTED]> wrote in message
000f01c2c301$fca17ae0$[EMAIL PROTECTED]">news:000f01c2c301$fca17ae0$[EMAIL PROTECTED]...
> Hi Andreas,
>
[snip]
> Some things ive come across include:
>
[snip]

Undo library may also provide features like:
- user friendly description of what is going to be undoed/redoed,
- ability to keep only N last undo steps in memory and save rest on disk
(maybe with help of an serialisation library),
- ability to group multiple undo commands to one (e.g. moves),
- ability to generate 'change log' for any given time period.

Most of it may be implemented by specialised command manager.

/Pavel



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Named Pairs

2003-01-23 Thread Fredrik Blomqvist
"Fredrik Blomqvist" <[EMAIL PROTECTED]> wrote in message
b0pj3o$p42$[EMAIL PROTECTED]">news:b0pj3o$p42$[EMAIL PROTECTED]...
> This is interesting stuff, but I think you should checkout Emily Winch's
> more general compile-time associative list implementation also.
> (http://groups.yahoo.com/group/boost/files/alist-feb14-02.zip seems to be
> the latest)

Sorry, wrong link... should be:
http://groups.yahoo.com/group/boost/files/associative_list/



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



RE: [boost] Named Pairs

2003-01-23 Thread Rozental, Gennadiy
First of all there are several glitches here:

> template 
> class named_pair{
>   public:
>   template  
>   class var{};
>   
 template<>?
>   class var<_Name1>{

 I am not sure that you allowed to use template parameter for defining
partial specialization.
>   public:
> _T1 value;
>   }

;?

>   
 template<>?
>   class var<_Name2>{
public:
> _T2 value;
>   }

;?

> };
> 
> enum{  Cash,  Name  };
> 
> void main(int argc, char *argv[]){
>   named_pair foobar;
> 
>   foobar.var.value = 32.2;
>   foobar.var.value = "Fred";

Even if above class definition is allowed foobar.var will be invalud
cause var is a type name. So basically what you are doing is unusable.

> }

Look on MPL example for inherit_linear. It may have what you need.

Gennadiy.

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Named Pairs

2003-01-23 Thread Fredrik Blomqvist
This is interesting stuff, but I think you should checkout Emily Winch's
more general compile-time associative list implementation also.
(http://groups.yahoo.com/group/boost/files/alist-feb14-02.zip seems to be
the latest)

What's the status of the Emily's lib btw? Is an MPL/Boost integration under
consideration?

"Jason House" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> I tried to do the following implementation in visual studio 6 to see if
> I could get a named pair class.
>
> I tried a number of approaches, but none worked with my compiler.  Is my
> approach fundamentally flawed?
>
> I think that something like this would be a useful utility to have.
> Anyone have any ideas on how to improve the class?
>
> 
> template 
> class named_pair{
>   public:
>   template 
>   class var{};
>
>   class var<_Name1>{
>   public:
> _T1 value;
>   }
>
>   class var<_Name2>{
> _T2 value;
>   }
> };
>
> enum{  Cash,  Name  };
>
> void main(int argc, char *argv[]){
>   named_pair foobar;
>
>   foobar.var.value = 32.2;
>   foobar.var.value = "Fred";
> }
>



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: A question about static_log2

2003-01-23 Thread Gennaro Prota
On Thu, 23 Jan 2003 03:26:52 +0200, "Vesa Karvonen"
<[EMAIL PROTECTED]> wrote:

>Hi,
>
>I'm sorry, but I have too little time to comment more extensively on this 
>subject

No problem. I just have to thank you for the attention and the useful
comments. Feel also free to continue the discussion when you'll have
more time even if this thread is then "old", and/or to contact me by
private mail.

> (other duties demand attention). Below you'll find an algorithm, 
>that chooses a proper value of n from where to start the log2<> algorithm 
>presented earlier.

Before resorting to the = sizeof hack I thought to several solutions.
It's obvious that the value we need is just 1 + log2. So
one solution would have been to use the trivial log2 = 1+log2(n/2)
implementation for the initial value only, and the optimized binary
search implementation for the rest. Since unsigned long are guaranteed
to have at least 32 value bits, one could have done:

 const int initial_value = 31 + trivial_log2 (ULONG_MAX/2147483648ul)

saving some thirty instantiations. Still it would give you an error
with 64 bits ulongs and compilers with a small instantiation limit
however, thus I gave up.

> It does not depend on  and it should always 
>produce a value that has the correct properties.

Vesa, I really appreciate your attempt but your code assumes the
required number to be a power of two (it just tries 32, 64, 128,
etc.). What about 48 bits unsigned long? I'll think about the issue
and see if I have anything better than this. If so I'll post it here.


Genny.

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Named Pairs

2003-01-23 Thread Jason House
I tried to do the following implementation in visual studio 6 to see if
I could get a named pair class.  

I tried a number of approaches, but none worked with my compiler.  Is my
approach fundamentally flawed?

I think that something like this would be a useful utility to have. 
Anyone have any ideas on how to improve the class?


template 
class named_pair{
  public:
  template  
  class var{};
  
  class var<_Name1>{
  public:
_T1 value;
  }
  
  class var<_Name2>{
_T2 value;
  }
};

enum{  Cash,  Name  };

void main(int argc, char *argv[]){
  named_pair foobar;

  foobar.var.value = 32.2;
  foobar.var.value = "Fred";
}

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: Re: Re: Review results: Optional library

2003-01-23 Thread Fernando Cacciola

"William E. Kempf" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> Fernando Cacciola said:
> > "William E. Kempf" <[EMAIL PROTECTED]> wrote in message
> >> Fernando Cacciola said:
> >>  However, shouldn't you be using "run" instead of
> >> "unit-test" in the Jamfile?
> >>
> > Yes :-)  I was looking at the wrong examples.
> >
> > Fixed now. (could you re-test it?)
>
> $ bjam
> Jamfile: line 25: syntax error at keyword ;
> Jamfile: line 25: syntax error at keyword ;
> Jamfile: line 26: syntax error at keyword }
> Jamfile: line 26: syntax error at keyword }
> found 8 targets...
>
It looks like the syntax for the compile-fail (plus the ) is
wrong...
I've removed the fail cases altogether until I can test it myself so I don't
abuse anymore of your time.
It runs only the ordinary test now
It should work I think.

--
Fernando Cacciola



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: is_convertible corner case

2003-01-23 Thread Gennaro Prota

These are a couple of miscellaneous thoughts as well:

John Spicer wrote:
>I'm happy to voice an opinion, although I don't think I
>have anything to add that hasn't already been said.
>
>I think that is_convertible should be based as closely
>as possible on the definition in clause 4 of the
>standard.  As has been pointed out, a problem with this
>is that the standard refers to a source expression, not
>a source type.  I think this means that the definition
>of is_converible needs to say something like "True if
>an lvalue of type From can be converted to type To
>according to 4p3" (or make it an rvalue, but you have
>to pick one).

- I understand that this is an informal description on John's part,
just to give us an idea, so I'm not nitpicking on the specific
wording. But it's IMHO important to consider that C++ has at least two
cases of conversions whose validity depends not on the type but on the
specific expression used (off the top of my head they are the only two
ones, but I would be cautious before stating that):

   One is conversion to a pointer type: in this case you can have
   a source expression of any integer type, but it must be constant
   and have the value zero. Example:

   int * p = '\0';

   enum { e = 5 };
   int (*pf)() = 4 % ( e - '\001');

   If you use the indeterminate article "a"/"an" in the wording above
   ("an" rvalue of type From) does it mean: "all" expressions of type
   From or "at least one" expression of type From? Of course, to
   exclude int->pointer-to-object convertibility one would say "all"
   expressions, but I'm not sure whether this is ok for UDTs.


   The other case is the deprecated conversion const char [N] -> char*
   which is valid only if the source expression is a string literal.


- Another point that I would like to understand is "where"
convertibility is checked. Currently convertibility is checked in the
scope of is_convertible<> but is this the intent? This makes a
difference when you have e.g. a private conversion operator:


  class X {
  operator int(); // private
  friend class Y;
  };

  class Y {
  void f() {
  is_convertible::value;  // true or false??
  // or error?
  }
  };



Genny.

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: Re: Review results: Optional library

2003-01-23 Thread David Abrahams
"William E. Kempf" <[EMAIL PROTECTED]> writes:

> Fernando Cacciola said:
>> "William E. Kempf" <[EMAIL PROTECTED]> wrote in message
>>> Fernando Cacciola said:
>>>  However, shouldn't you be using "run" instead of
>>> "unit-test" in the Jamfile?
>>>
>> Yes :-)  I was looking at the wrong examples.

Actually, unit-test just invokes run since 2003/01/05, so it's OK to
use it.

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Douglas Paul Gregor
On Thu, 23 Jan 2003, David Abrahams wrote:

> Douglas Paul Gregor <[EMAIL PROTECTED]> writes:
>
> > On Thu, 23 Jan 2003, David Abrahams wrote:
> >> No, I mean the complexity-of-expression issue.
> >
> > Hmmm, I don't see how that issue applies.
>
> I don't know what you mean by that.  Are you saying that Andrei was
> making an invalid argument?  I wouldn't agree with that.

Andrei's argument was that this form for a for_each loop:

  inline void do_my_function(string&, void_) {}

  template 
  inline void do_my_function(string& s, Lst lst)
  {
  my_function::type>(s);
  do_my_function(s, pop_front::type());
  }
  ...
  do_my_function(s, my_list());

, which he posted here:
  http://lists.boost.org/MailArchives/boost/msg42374.php

is less complex than the solution you posted, which uses MPL's for_each:
  http://lists.boost.org/MailArchives/boost/msg42369.php

Somewhere in reading the thread I replaced the rather simple definitions
of "func" in your message with an MPL metafunction class. Re-reading it
now, I see that the solution I'm proposing would require almost identical
code to what you posted, with the exception that:
  mpl::for_each(func(s));

... would become:

  for_each(my_list().begin(), my_list().end(), func(s));

Anyway, Andrei's argument is a good one, and I see that it holds against
the for_each that I'm proposing as well.

> > STL users know how to write function objects. It's not a gigantic
> > leap to write function objects with a templated function call
> > operator (at least, it isn't if you've already decided to play with
> > template metaprogramming). The rest of the syntax is inherited from
> > STL. I don't see any extra complexity here. Granted, it means
> > pulling in a lot more code than Andrei's version,
>
> And writing a lot more code.

Yes, those wretched function object->overloaded function bridges take up a
lot of space, even if they are trivial.

Doug

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: Re: Review results: Optional library

2003-01-23 Thread William E. Kempf
Fernando Cacciola said:
> "William E. Kempf" <[EMAIL PROTECTED]> wrote in message
>> Fernando Cacciola said:
>>  However, shouldn't you be using "run" instead of
>> "unit-test" in the Jamfile?
>>
> Yes :-)  I was looking at the wrong examples.
>
> Fixed now. (could you re-test it?)

$ bjam
Jamfile: line 25: syntax error at keyword ;
Jamfile: line 25: syntax error at keyword ;
Jamfile: line 26: syntax error at keyword }
Jamfile: line 26: syntax error at keyword }
found 8 targets...

William E. Kempf
[EMAIL PROTECTED]


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] cstdint.hpp patch for Cray X1

2003-01-23 Thread Matthias Troyer

On Thursday, January 23, 2003, at 07:14 PM, Dan Gohman wrote:


Hi Matthias,

The reason for special-casing the Cray X1 here is so that int_fast16_t
isn't defined to be short, as short has performance penalties 
associated
with it on this platform.

Hi Dan,

I missed that point. Yes, you are right int_fast16_t should be int on 
the X1.
I guess we could also define it as short on the SV1 and other machnes 
with 32 bit shorts. Unfortunately there is no 16 bit integer type on 
those machines.

Matthias

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost


[boost] Re: Re: Re: Review results: Optional library

2003-01-23 Thread Fernando Cacciola

"David Abrahams" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> "William E. Kempf" <[EMAIL PROTECTED]> writes:
>
> > Fernando Cacciola said:
> >> I've committed "Jamfile" to libs/optional/test.
> >>
> >> But I can't run bjam on my Win98 configuration (long command lines
> >> problem), so I can't test it.
> >
> > Doesn't bjam have a fix for this issue?
>
> For most cases, yes.
> You can build bjam under Cygwin as a last resort.
>
Yes.
I still have to finish updating my Cygwin box.
Then I will be able to run bjam with at least gcc.


--
Fernando Cacciola



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] -lrt on Mandrake 9.0

2003-01-23 Thread Alkis Evlogimenos
On Thursday 23 January 2003 11:01 pm, William E. Kempf wrote:
> Can anyone explain to me what's wrong on my system that -lrt isn't finding
> the library?

You need to install glibc-devel. Issuing "urpmi glibc-devel" as root should do 
it. Mandrake separates runtime and devel packages and thus if you want to do 
development you have to install the corresponding -devel packages.

-- 

Alkis

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] cstdint.hpp patch for Cray X1

2003-01-23 Thread Dan Gohman
Hi Matthias,

The reason for special-casing the Cray X1 here is so that int_fast16_t
isn't defined to be short, as short has performance penalties associated
with it on this platform.

I can't guarantee I'll be able to test jam, but I'll let you know if I
get to it.

Dan

On Thu, 2003-01-23 at 11:43, Matthias Troyer wrote:
> Hi Dan,
> 
> I don't think this will be needed since on the X1 USHRT_MAX should be 
> 0x, and thus the default version will work. Note that the patch for 
> the SV1 and other Crays that I submitted checks for USHRT_MAX being 
> 0x and thus does not apply on the X1 anyways.
> 
> On another note, I got jam to compile on the SV1, and have submitted a 
> patch. Now I am running the regression tests on it. Not having access 
> to an X1 yet (and the 4.2 compilers don't exist for other Crays), I 
> can't run the tests there at the moment. Could you try to run it, once 
> I have patched boost for the SV1?
> 
> Best regards,
> 
> Matthias
> 
> On Thursday, January 23, 2003, at 05:49 PM, Dan Gohman wrote:
> 
> > The recent change to boost/cstdint.hpp for Cray systems is not
> > appropriate for the Cray X1. It has a 16-bit short type, however there
> > are performance penalties associated with it.
> >
> > The following patch for cstdint.hpp sets up the appropriate typedefs 
> > for
> > this platform.
> >
> > diff -u -r1.29 cstdint.hpp
> > --- boost/cstdint.hpp   22 Jan 2003 12:12:14 -  1.29
> > +++ boost/cstdint.hpp   23 Jan 2003 16:32:04 -
> > @@ -160,7 +160,16 @@
> >
> >  //  16-bit types
> > ---//
> >
> > -# if USHRT_MAX == 0x
> > +# if defined(__crayx1)
> > + // The Cray X1 has a 16-bit short, however it is not recommend
> > + // for use in performance critical code.
> > + typedef short   int16_t;
> > + typedef short   int_least16_t;
> > + typedef int int_fast16_t;
> > + typedef unsigned short  uint16_t;
> > + typedef unsigned short  uint_least16_t;
> > + typedef unsigned intuint_fast16_t;
> > +# elif USHRT_MAX == 0x
> >   typedef short   int16_t;
> >   typedef short   int_least16_t;
> >   typedef short   int_fast16_t;
> >
> > ___
> > Unsubscribe & other changes: 
> > http://lists.boost.org/mailman/listinfo.cgi/boost
> 

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: Re: Review results: Optional library

2003-01-23 Thread Fernando Cacciola

"William E. Kempf" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
>
> Fernando Cacciola said:
> > I've committed "Jamfile" to libs/optional/test.
> >
> > But I can't run bjam on my Win98 configuration (long command lines
> > problem), so I can't test it.
>
> Doesn't bjam have a fix for this issue?
>
Not for Windows, AFAICT.

> > Could someone test the jamfile? If it works, I'l add the entry on
> > status/Jamfile.
>
> It passes for me (well, sort of, toolset for vc7, vc71 and gcc-nocygwin
> pass, while msvc fails).

hmmm. I'll take a look at those on which it fails when the regressions are
fully run.

>  However, shouldn't you be using "run" instead of
> "unit-test" in the Jamfile?
>
Yes :-)  I was looking at the wrong examples.

Fixed now. (could you re-test it?)


--
Fernando Cacciola



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
Douglas Paul Gregor <[EMAIL PROTECTED]> writes:

> On Thu, 23 Jan 2003, David Abrahams wrote:
>
>> Douglas Paul Gregor <[EMAIL PROTECTED]> writes:
>>
>> > On Thu, 23 Jan 2003, David Abrahams wrote:
>> >> AFAICT it
>> >> doesn't solve the problem that Andrei was pointing at.
>> >
>> > You mean the front/pop_front issue?
>>
>> No, I mean the complexity-of-expression issue.
>
> Hmmm, I don't see how that issue applies. 

I don't know what you mean by that.  Are you saying that Andrei was
making an invalid argument?  I wouldn't agree with that.

> STL users know how to write function objects. It's not a gigantic
> leap to write function objects with a templated function call
> operator (at least, it isn't if you've already decided to play with
> template metaprogramming). The rest of the syntax is inherited from
> STL. I don't see any extra complexity here. Granted, it means
> pulling in a lot more code than Andrei's version, 

And writing a lot more code.

> but as one who has written that same bit of code approximately a
> billion times I'm ready for a simple, familiar abstraction.

Yeah, as I said I'm more comfortable with it too.

>> > Just stick your third-party iterators into sequence<> and you're all set;
>> > I'd expect that mpl::list, mpl::vector, etc. would just derive from
>> > mpl::sequence to reduce the amount of typing in the common case.
>>
>> Maybe it would be better to define namespace-scope begin(), end(),
>> et. al which can operate on STL and MPL sequences.
>
> I have two concerns with that:
>   1) begin and end are already class templates in MPL
>   2) There isn't much precedent for begin(container) and end(container);
> there is for container.begin() and container.end()

OK.  I think it would be best to start by making an experimental layer
on top of MPL in the sandbox.

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: Review results: Optional library

2003-01-23 Thread David Abrahams
"William E. Kempf" <[EMAIL PROTECTED]> writes:

> Fernando Cacciola said:
>> I've committed "Jamfile" to libs/optional/test.
>>
>> But I can't run bjam on my Win98 configuration (long command lines
>> problem), so I can't test it.
>
> Doesn't bjam have a fix for this issue?

For most cases, yes.
You can build bjam under Cygwin as a last resort.


-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] cstdint.hpp patch for Cray X1

2003-01-23 Thread Matthias Troyer
Hi Dan,

I don't think this will be needed since on the X1 USHRT_MAX should be 
0x, and thus the default version will work. Note that the patch for 
the SV1 and other Crays that I submitted checks for USHRT_MAX being 
0x and thus does not apply on the X1 anyways.

On another note, I got jam to compile on the SV1, and have submitted a 
patch. Now I am running the regression tests on it. Not having access 
to an X1 yet (and the 4.2 compilers don't exist for other Crays), I 
can't run the tests there at the moment. Could you try to run it, once 
I have patched boost for the SV1?

Best regards,

Matthias

On Thursday, January 23, 2003, at 05:49 PM, Dan Gohman wrote:

The recent change to boost/cstdint.hpp for Cray systems is not
appropriate for the Cray X1. It has a 16-bit short type, however there
are performance penalties associated with it.

The following patch for cstdint.hpp sets up the appropriate typedefs 
for
this platform.

diff -u -r1.29 cstdint.hpp
--- boost/cstdint.hpp   22 Jan 2003 12:12:14 -  1.29
+++ boost/cstdint.hpp   23 Jan 2003 16:32:04 -
@@ -160,7 +160,16 @@

 //  16-bit types
---//

-# if USHRT_MAX == 0x
+# if defined(__crayx1)
+ // The Cray X1 has a 16-bit short, however it is not recommend
+ // for use in performance critical code.
+ typedef short   int16_t;
+ typedef short   int_least16_t;
+ typedef int int_fast16_t;
+ typedef unsigned short  uint16_t;
+ typedef unsigned short  uint_least16_t;
+ typedef unsigned intuint_fast16_t;
+# elif USHRT_MAX == 0x
  typedef short   int16_t;
  typedef short   int_least16_t;
  typedef short   int_fast16_t;

___
Unsubscribe & other changes: 
http://lists.boost.org/mailman/listinfo.cgi/boost

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: Re: Review results: Optional library

2003-01-23 Thread William E. Kempf

Fernando Cacciola said:
> I've committed "Jamfile" to libs/optional/test.
>
> But I can't run bjam on my Win98 configuration (long command lines
> problem), so I can't test it.

Doesn't bjam have a fix for this issue?

> Could someone test the jamfile? If it works, I'l add the entry on
> status/Jamfile.

It passes for me (well, sort of, toolset for vc7, vc71 and gcc-nocygwin
pass, while msvc fails).  However, shouldn't you be using "run" instead of
"unit-test" in the Jamfile?

William E. Kempf
[EMAIL PROTECTED]


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



RE: [boost] Re: undo library

2003-01-23 Thread Steven Mauceri
Hi Andreas,

An undo library seems to be on a boundary between patterns and library
functions, so im interested in seeing how something like an undo library
plays out.

Some things ive come across include:

- The need to keep objects utilized in doIt() alive until they leave the
undo list (this sometimes is even beyond serialization).  Implementers
of command objects frequently use some type of shared_ptr to keep things
alive after use (until they fall off the undo queue).

- The need to keep things simple, as Steven Kirk noted.  This competes
with the need to employ a more complex (as applications grow) command /
command-manager interface.  Providing a command-base-imp might be a way
to satisfy both users.

- The ability for commands that can not support undo to inform the
manager (sending an email, committing transactions, or a developer
testing new objects are examples of commands that do not support undo).
When these commands are executed, they clear the undo-stack (this can be
augmented in a UI app with a message informing the user they are about
to execute an undoable command).

- The need to support various command managers.  People may want to
extend the behavior of the undo-manager, but often start out with a
default manager (templatizing the manager's container might also be an
option).

The code below might help illustrate the suggestions mentioned above
(and by S.Kirk in the previous email) for the command class (The manager
interface is a separate discussion probably :-).

- Steve

struct command
{
 virtual void doIt()   = 0; // Called first time
 virtual void undoIt() = 0; // Called to undo
 virtual void redoIt() = 0; // Called after first time

 virtual bool supportsUndo() = 0;
 virtual bool supportsRedo() = 0;

 virtual ~command() {}
};

struct commandBinder : public command
{
 commandBinder( const boost::function &doItFn, 
  const boost::function &redoItFn =
&commandBinder::redoUnsupported,
  const boost::function &undoItFn =
&commandBinder::undoUnsupported )
   : m_doItFunction( doItFn ), 
 m_undoItFunction( undoItFn ), 
 m_redoItFunction( redoItFn ) {}

 virtual void invokeCommand( 
   const boost::function &fn, const std::string &msg )
 {
  if ( fn.empty() )
   throw undo_exception( msg.c_str() );
  else
   fn();
 }

 virtual void doIt()
 { invokeCommand( m_doItFunction,   "" ); }
 
 virtual void redoIt() 
 { invokeCommand( m_redoItFunction, "redoIt unsupported" ); }

 virtual void undoIt()
 { invokeCommand( m_undoItFunction, "undoIt unsupported" ); }

 virtual bool supportsUndo() { return !m_undoItFunction.empty(); }

 virtual bool supportsRedo() { return !m_redoItFunction.empty(); }

 boost::function m_doItFunction;
 boost::function m_redoItFunction;
 boost::function m_undoItFunction;

 static void undoUnsupported() {}
 static void redoUnsupported() {}

 virtual ~commandBinder() {}
};

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] -lrt on Mandrake 9.0

2003-01-23 Thread William E. Kempf
Sorry for this slightly off topic question, but I'm not a Linux user by
trade.  I've recently switched distributions to Mandrake 9.0, which comes
with GCC 3.2 out of the box.  When trying to compile Boost.Threads on this
platform I encounter the following problem:

gcc-Link-action
.../../../libs/thread/test/bin/test_thread.test/gcc/debug/runtime
-link-static/threading-multi/test_thread
/usr/bin/ld: cannot find -lrt
collect2: ld returned 1 exit status

LD_LIBRARY_PATH=../../../libs/thread/build/bin/libboost_thread.so/gcc/debug/
runtime-link-static/shared-linkable-true/threading-multi
export LD_LIBRARY_PATH
g++   -static -g -pthread  -o
"../../../libs/thread/test/bin/test_thread.tes
t/gcc/debug/runtime-link-static/threading-multi/test_thread" 
-L"../../../libs/t
hread/build/bin/libboost_thread.so/gcc/debug/runtime-link-static/shared-linkable
-true/threading-multi"  
"../../../libs/thread/test/bin/test_thread.test/gcc/deb
ug/runtime-link-static/threading-multi/test_thread.o" 
"../../../libs/test/build
/bin/libboost_unit_test_framework.a/gcc/debug/runtime-link-static/threading-mult
i/libboost_unit_test_framework.a"
"../../../libs/test/build/bin/libboost_unit_te
st_framework.a/gcc/debug/runtime-link-static/threading-multi/libboost_unit_test_
framework.a" 
"../../../libs/test/build/bin/libboost_unit_test_framework.a/gcc/d
ebug/runtime-link-static/threading-multi/libboost_unit_test_framework.a"
"../../
.../libs/test/build/bin/libboost_unit_test_framework.a/gcc/debug/runtime-link-sta
tic/threading-multi/libboost_unit_test_framework.a"   -lrt -lboost_thread 
-Wl,-
rpath-link,.

Can anyone explain to me what's wrong on my system that -lrt isn't finding
the library?

William E. Kempf
[EMAIL PROTECTED]


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] cstdint.hpp patch for Cray X1

2003-01-23 Thread Dan Gohman
The recent change to boost/cstdint.hpp for Cray systems is not
appropriate for the Cray X1. It has a 16-bit short type, however there
are performance penalties associated with it.

The following patch for cstdint.hpp sets up the appropriate typedefs for
this platform.

diff -u -r1.29 cstdint.hpp
--- boost/cstdint.hpp   22 Jan 2003 12:12:14 -  1.29
+++ boost/cstdint.hpp   23 Jan 2003 16:32:04 -
@@ -160,7 +160,16 @@
 
 //  16-bit types 
---//
 
-# if USHRT_MAX == 0x
+# if defined(__crayx1)
+ // The Cray X1 has a 16-bit short, however it is not recommend
+ // for use in performance critical code.
+ typedef short   int16_t;
+ typedef short   int_least16_t;
+ typedef int int_fast16_t;
+ typedef unsigned short  uint16_t;
+ typedef unsigned short  uint_least16_t;
+ typedef unsigned intuint_fast16_t;
+# elif USHRT_MAX == 0x
  typedef short   int16_t;
  typedef short   int_least16_t;
  typedef short   int_fast16_t;

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Douglas Paul Gregor
On Thu, 23 Jan 2003, David Abrahams wrote:

> Douglas Paul Gregor <[EMAIL PROTECTED]> writes:
>
> > On Thu, 23 Jan 2003, David Abrahams wrote:
> >> AFAICT it
> >> doesn't solve the problem that Andrei was pointing at.
> >
> > You mean the front/pop_front issue?
>
> No, I mean the complexity-of-expression issue.

Hmmm, I don't see how that issue applies. STL users know how to write
function objects. It's not a gigantic leap to write function objects with
a templated function call operator (at least, it isn't if you've already
decided to play with template metaprogramming). The rest of the syntax is
inherited from STL. I don't see any extra complexity here. Granted, it
means pulling in a lot more code than Andrei's version, but as one who has
written that same bit of code approximately a billion times I'm ready for
a simple, familiar abstraction.

> > Just stick your third-party iterators into sequence<> and you're all set;
> > I'd expect that mpl::list, mpl::vector, etc. would just derive from
> > mpl::sequence to reduce the amount of typing in the common case.
>
> Maybe it would be better to define namespace-scope begin(), end(),
> et. al which can operate on STL and MPL sequences.

I have two concerns with that:
  1) begin and end are already class templates in MPL
  2) There isn't much precedent for begin(container) and end(container);
there is for container.begin() and container.end()

Doug

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: MPL usage for code generation

2003-01-23 Thread Hugo Duncan
On Thu, 23 Jan 2003 11:22:02 -0500, David Abrahams <[EMAIL PROTECTED]> wrote:
> Hugo Duncan <[EMAIL PROTECTED]> writes:
> 
> > Including for_each.hpp on bcc561 gives
> >
> > Error E2230
> > c:\usr\boost\boost/mpl/aux_/preprocessed/bcc/template_arity.hpp
> > 20: In-line data member initialization requires an
> > integral constant expression
> >
> > Any chance of finding a fix for this?  I am having
> > problems working through the code to see what to
> > change.
> 
> Is this with the CVS or with boost 1.29.0?
> I don't think Borland support was very solid at 1.29.0.
> 
> BC551 processes for_each.hpp just fine at the moment.

With current CVS.  BC551 works fine for me too (with lots of warnings)



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: Re: Review results: Optional library

2003-01-23 Thread Fernando Cacciola

"Beman Dawes" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> At 01:56 PM 1/22/2003, Douglas Paul Gregor wrote:
>
>  >On Wed, 22 Jan 2003, Fernando Cacciola wrote:
>  >> So, what else should I do? Is there something I need to setup in order
> to
>  >> add optional to the regression tests?
>  >
>  >You'll probably want to create a testing Jamfile
>  >libs/optional/test/Jamfile. The easy way to do that is to cut 'n' paste
>  >from, e.g., libs/filesystem/test/Jamfile and make the obvious changes.
>  >Then, add "subinclude libs/optional/test/Jamfile ;" to status/Jamfile
and
>  >the Optional tests should start showing up with the next round of
>  >regression testing.
>
> Yes, but please test your lib specific Jamfile first, before changing the
> status/Jamfile.
>
> Developers should always make sure the local Jamfile works before
> subincluding it in the main Boost Jamfile.
>
> See the recently updated docs in more/regression.html
>
OK.
I've committed "Jamfile" to libs/optional/test.

But I can't run bjam on my Win98 configuration (long command lines problem),
so I can't test it.
Could someone test the jamfile? If it works, I'l add the entry on
status/Jamfile.

TIA


--
Fernando Cacciola




___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: is_convertible corner case

2003-01-23 Thread David Abrahams
"Peter Dimov" <[EMAIL PROTECTED]> writes:

> From: "John Maddock" <[EMAIL PROTECTED]>
>> >From Peter Dimov:
>>
>> >Nope, it says nothing AFAICS. A type cannot be convertible. Only values
>> are.
>> >And you cannot say "a value of type From is implicitly convertible to To
>> >(4.0)" because you need to specify whether that value is an lvalue of
> type
>> >From or an rvalue of type From, and what do l- and r-values mean when
>> >applied to strange (array, reference, function, abstract, etc) types.
>>
>> I refer you back to 4.0p3, which talks about expressions of type T, which
>> are treated as lvalues if the type is a reference, otherwise as an rvalue.
>
> Thanks.
>
> I don't think that 4.0p3 explains everything, though. I doesn't talk about
> expressions of type T. It talks about converting an expression e to type T;
> it then explains that the result of that conversion is an lvalue when T
> ("To" in our case) is a reference type. It says that e is "used as an
> lvalue" if and only if the initialization T t(e) would have used it as an
> lvalue.
>
> This still doesn't solve the "expression of type From" problem since an
> expression can be either an lvalue or an rvalue, and there are no
> expressions of reference types, only expressions that are lvalues. Of course
> I'm not a core expert.
>
> For example, is an expression of type int[4] convertible to int[4]? To int
> (&) [4]? To int const [4]?

If it's any help, here's what John Spicer says:

> David Abrahams <[EMAIL PROTECTED]> writes:
>
>>Hi John,
>>
>>I realize there's a lot of material here, but I wonder if you wouldn't
>>mind taking a look at it all the same?  We're having problems
>>understanding how to talk about the behavior of the is_convertible
>>trait from the type traits library (and standard proposal).  Any
>>guidance you could give would be very helpful.
>>

I'm happy to voice an opinion, although I don't think I
have anything to add that hasn't already been said.

I think that is_convertible should be based as closely
as possible on the definition in clause 4 of the
standard.  As has been pointed out, a problem with this
is that the standard refers to a source expression, not
a source type.  I think this means that the definition
of is_converible needs to say something like "True if
an lvalue of type From can be converted to type To
according to 4p3" (or make it an rvalue, but you have
to pick one).  You could, of course, have two versions
of is_convertible to handle both lvalues and rvalues.

A few miscellaneous comments:

- There are no expressions of reference type, so
presumably a reference on the from type should be
ignored (which it would based on a definition that used
an expression having type From.

- There were several mentions of prohibiting abstract
types.  Expressions of abstract class type can be the
source of an implicit conversion, however.

- There was a mention of special treatment of parameter
types that are arrays. I don't think this is an issue
as you are dealing with types and even if you declare a
parameter of type X[], it has type X*.

Hope this is of some use.

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
Hugo Duncan <[EMAIL PROTECTED]> writes:

> Including for_each.hpp on bcc561 gives
>
> Error E2230
> c:\usr\boost\boost/mpl/aux_/preprocessed/bcc/template_arity.hpp
> 20: In-line data member initialization requires an
> integral constant expression
>
> Any chance of finding a fix for this?  I am having
> problems working through the code to see what to
> change.

Is this with the CVS or with boost 1.29.0?
I don't think Borland support was very solid at 1.29.0.

BC551 processes for_each.hpp just fine at the moment.

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: [Boost-docs] Integrating BoostBook documentationwith HTMLdocumentation

2003-01-23 Thread Douglas Paul Gregor
On Thu, 23 Jan 2003, David Abrahams wrote:
> I've been watching this thread go by; kept a bunch of messages in my
> inbox because I didn't know what to make of them, and now I realize I
> still don't.  It looks like there is going to be a big learning curve
> for me; I have practically no XML/XSLT experience to begin with, not
> to mention that I don't understand lots of other issues.  Should I be
> doing something other than sitting on the sidelines?
>
> -Dave

You won't need to know any XSLT unless you want to introduce additional
features into BoostBook.

The learning curve for XML is practically nonexistant. There's a few lines
of boilerplate code for identifying a particular document as a BoostBook
document. From there on, it's just a matter of matching tags :). I've
found XML tools to be quite good: parser error messages are generally
quite obvious, and some text editors can help avoid lots of dumb mistakes.

In the next few days I'll be writing a tutorial on BoostBook, describing
the documentation of a small library (boost::any). That should drastically
reduce the hassle of learning BoostBook, and make it feasible for others
to try it out.

Doug

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
Douglas Paul Gregor <[EMAIL PROTECTED]> writes:

> On Thu, 23 Jan 2003, David Abrahams wrote:
>
>> Douglas Paul Gregor <[EMAIL PROTECTED]> writes:
>>
>> > Why don't we have
>> >
>> >   mpl::list list_of_types;
>> >   for_each(list_of_types.begin(), list_of_types.end(), f);
>> >
>> > ?
>> >
>> > Then an unqualified for_each call can handle type sequences, heterogeneous
>> > containers (e.g., tuple), and run-time sequences (e.g., vector). It's been
>> > done before, elsewhere, so why don't we do it in MPL?
>>
>> It's clever, but I'm not sure what problem it's solving.
>
> I mentioned this before and cited the paper "Static Data
> Structures: Reconciling Template Metaprogramming and Generic Programming":
>   http://aspn.activestate.com/ASPN/Mail/Message/1304415
>
> The title says it all: we have generic programming and template
> metaprogramming, and they complement each other nicely, but at the barrier
> between them I feel that we have a kludge. MPL and STL are built on the
> same abstractions, with similar naming schemes and similar style, so why
> is it that at the bridge between the two we have something that looks like
> neither? I think the for_each syntax I'm referring to is a clean bridge
> between the two, because it (logically, if not in code) maps the syntax of
> STL iterators to the syntax of MPL iterators in standard algorithm calls.
> The paper I referred to gave the most compelling argument for having
> precisely the same syntax at the bridge: you can test with the run-time
> version (short compile times) and release with the compile-time version
> (short execution times): they needed only to switch the object from
> std::vector to a compile-time vector, wait for KAI C++ to grind away for
> 24 hours, and they got 171 times the performance.

OK, point taken.  I think it's worth examining.

>> AFAICT it
>> doesn't solve the problem that Andrei was pointing at.
>
> You mean the front/pop_front issue?

No, I mean the complexity-of-expression issue.

>> It also has at
>> least one problem: it is intrusive on sequence types, requiring them
>> to have begin()/end() member functions.  If this was the only way to
>> do it, it would break interoperability with 3rd-party type sequences.
>>
>> -Dave
>
> That's easy to fix---I was just trying to keep the example small. A few
> extra abstractions would be needed:
>
> namespace mpl {
>   // Special type that for_each can pick up on
>   template
>   struct iterator
>   {
> typedef Iterator type;
>   };
>
>   // Stores an MPL sequence defined by an iterator range
>   template
>   struct sequence
>   {
> iterator begin() const { return iterator(); }
> iterator   end() const   { return iterator(); }
>   };
>
>   template
>   F for_each(iterator first, iterator last, F f)
>   {
> // ...
>   }
> }
>
> Just stick your third-party iterators into sequence<> and you're all set;
> I'd expect that mpl::list, mpl::vector, etc. would just derive from
> mpl::sequence to reduce the amount of typing in the common case.

Maybe it would be better to define namespace-scope begin(), end(),
et. al which can operate on STL and MPL sequences.

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: MPL usage for code generation

2003-01-23 Thread Hugo Duncan
Including for_each.hpp on bcc561 gives

Error E2230 c:\usr\boost\boost/mpl/aux_/preprocessed/bcc/template_arity.hpp 20: 
In-line data member initialization requires an integral constant expression

Any chance of finding a fix for this?  I am having problems working through the code 
to see what to change.

Hugo



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] threads and gcc and BSD

2003-01-23 Thread Peter Dimov
From: "Rene Rivera" <[EMAIL PROTECTED]>
>
> Don't know about other *BSD-s but GCC on OpenBSD GCC defines
> _POSIX_THREADS=1 when the -pthread is used. Here are the details...

GCC 2.95.3/MinGW defines _MT=1 when -mthreads is used. GCC 2.96/Linux
defines _REENTRANT=1 when -pthread is used.

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Douglas Paul Gregor


On Thu, 23 Jan 2003, David Abrahams wrote:

> Douglas Paul Gregor <[EMAIL PROTECTED]> writes:
>
> > Why don't we have
> >
> >   mpl::list list_of_types;
> >   for_each(list_of_types.begin(), list_of_types.end(), f);
> >
> > ?
> >
> > Then an unqualified for_each call can handle type sequences, heterogeneous
> > containers (e.g., tuple), and run-time sequences (e.g., vector). It's been
> > done before, elsewhere, so why don't we do it in MPL?
>
> It's clever, but I'm not sure what problem it's solving.

I mentioned this before and cited the paper "Static Data
Structures: Reconciling Template Metaprogramming and Generic Programming":
  http://aspn.activestate.com/ASPN/Mail/Message/1304415

The title says it all: we have generic programming and template
metaprogramming, and they complement each other nicely, but at the barrier
between them I feel that we have a kludge. MPL and STL are built on the
same abstractions, with similar naming schemes and similar style, so why
is it that at the bridge between the two we have something that looks like
neither? I think the for_each syntax I'm referring to is a clean bridge
between the two, because it (logically, if not in code) maps the syntax of
STL iterators to the syntax of MPL iterators in standard algorithm calls.
The paper I referred to gave the most compelling argument for having
precisely the same syntax at the bridge: you can test with the run-time
version (short compile times) and release with the compile-time version
(short execution times): they needed only to switch the object from
std::vector to a compile-time vector, wait for KAI C++ to grind away for
24 hours, and they got 171 times the performance.

> AFAICT it
> doesn't solve the problem that Andrei was pointing at.

You mean the front/pop_front issue?

> It also has at
> least one problem: it is intrusive on sequence types, requiring them
> to have begin()/end() member functions.  If this was the only way to
> do it, it would break interoperability with 3rd-party type sequences.
>
> -Dave

That's easy to fix---I was just trying to keep the example small. A few
extra abstractions would be needed:

namespace mpl {
  // Special type that for_each can pick up on
  template
  struct iterator
  {
typedef Iterator type;
  };

  // Stores an MPL sequence defined by an iterator range
  template
  struct sequence
  {
iterator begin() const { return iterator(); }
iterator   end() const   { return iterator(); }
  };

  template
  F for_each(iterator first, iterator last, F f)
  {
// ...
  }
}

Just stick your third-party iterators into sequence<> and you're all set;
I'd expect that mpl::list, mpl::vector, etc. would just derive from
mpl::sequence to reduce the amount of typing in the common case.

Doug

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] threads and gcc and BSD

2003-01-23 Thread Rene Rivera
[2003-01-23] William E. Kempf wrote:

>> I think I may be the one who broke a lot of the OpenBSD regression tests
>> by defining BOOST_HAS_PTHREADS in the OpenBSD platform configuration.
>> IMO this is correct (OpenBSD supports pthreads right?),

Yes it does... with the -pthread flag.

>> but it causes a
>> problem: currently the gcc config unconditionally defines
>> BOOST_HAS_THREADS, basically because we didn't know what else to do (gcc
>> on *BSD doesn't define anything when you build with -pthread - basically
>> defining -pthread affects only the linker, so we can't detect when to
>> turn on threading support). 

Don't know about other *BSD-s but GCC on OpenBSD GCC defines
_POSIX_THREADS=1 when the -pthread is used. Here are the details...

red5of5:grafik {108} gcc -E -dM empty.c
#define __i386__ 1 
#define __GNUC_MINOR__ 95 
#define __unix__ 1 
#define __OpenBSD__ 1 
#define __GNUC__ 2 
red5of5:grafik {109} gcc -E -dM -pthread empty.c
#define __i386__ 1 
#define __GNUC_MINOR__ 95 
#define _POSIX_THREADS 1 
#define __unix__ 1 
#define __OpenBSD__ 1 
#define __GNUC__ 2 
red5of5:grafik {110} /usr/local/gcc-3.2/bin/gcc -E -dM empty.c
#define __HAVE_BUILTIN_SETJMP__ 1
#define __OpenBSD__ 1
#define __unix__ 1
#define __i386__ 1
#define __SIZE_TYPE__ unsigned int
#define __GNUC_PATCHLEVEL__ 0
#define __USER_LABEL_PREFIX__ _
#define __STDC_HOSTED__ 1
#define __WCHAR_TYPE__ int
#define __WINT_TYPE__ unsigned int
#define __GNUC__ 3
#define __USING_SJLJ_EXCEPTIONS__ 1
#define __GXX_ABI_VERSION 102
#define i386 1
#define __GNUC_MINOR__ 2
#define __STDC__ 1
#define __PTRDIFF_TYPE__ int
#define __tune_i386__ 1
#define __REGISTER_PREFIX__ 
#define __NO_INLINE__ 1
#define __i386 1
#define __VERSION__ "3.2"
red5of5:grafik {111} /usr/local/gcc-3.2/bin/gcc -E -dM -pthread empty.c
#define __HAVE_BUILTIN_SETJMP__ 1
#define __OpenBSD__ 1
#define __unix__ 1
#define __i386__ 1
#define __SIZE_TYPE__ unsigned int
#define _POSIX_THREADS 1
#define __GNUC_PATCHLEVEL__ 0
#define __USER_LABEL_PREFIX__ _
#define __STDC_HOSTED__ 1
#define __WCHAR_TYPE__ int
#define __WINT_TYPE__ unsigned int
#define __GNUC__ 3
#define __USING_SJLJ_EXCEPTIONS__ 1
#define __GXX_ABI_VERSION 102
#define i386 1
#define __GNUC_MINOR__ 2
#define __STDC__ 1
#define __PTRDIFF_TYPE__ int
#define __tune_i386__ 1
#define __REGISTER_PREFIX__ 
#define __NO_INLINE__ 1
#define __i386 1
#define __VERSION__ "3.2"


-- grafik - Don't Assume Anything
-- [EMAIL PROTECTED] - [EMAIL PROTECTED]
-- 102708583@icq
___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: [Boost-docs] Integrating BoostBook documentationwith HTMLdocumentation

2003-01-23 Thread David Abrahams

I've been watching this thread go by; kept a bunch of messages in my
inbox because I didn't know what to make of them, and now I realize I
still don't.  It looks like there is going to be a big learning curve
for me; I have practically no XML/XSLT experience to begin with, not
to mention that I don't understand lots of other issues.  Should I be
doing something other than sitting on the sidelines?

-Dave

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] threads and gcc and BSD

2003-01-23 Thread William E. Kempf

David Abrahams said:
> "William E. Kempf" <[EMAIL PROTECTED]> writes:
>
>> John Maddock said:
>>> I think I may be the one who broke a lot of the OpenBSD regression
>>> tests by defining BOOST_HAS_PTHREADS in the OpenBSD platform
>>> configuration. IMO this is correct (OpenBSD supports pthreads
>>> right?), but it causes a problem: currently the gcc config
>>> unconditionally defines
>>> BOOST_HAS_THREADS, basically because we didn't know what else to do
>>> (gcc on *BSD doesn't define anything when you build with -pthread -
>>> basically defining -pthread affects only the linker, so we can't
>>> detect when to turn on threading support). This in turn is breaking a
>>> lot of libraries: mainly those that depend upon smart pointers, which
>>> do internal thread synchronisation, and therefore need the -pthread
>>> option in order to link correctly.
>>>
>>> What should we do about this?
>>>
>>> Option 1:
>>> ~~
>>>
>>> would putting:
>>>
>>> flags gcc CFLAGS single : -DBOOST_DISABLE_THREADS
>>> ;
>>>
>>> fix the problem?
>>>
>>> Option 2:
>>> ~~
>>>
>>> Add
>>>
>>> flags gcc CFLAGS multi : -pthread -D_REENTRANT ;
>>>
>>> to the toolset, and stop defining BOOST_HAS_THREADS unconditionally
>>> for gcc. This one may have all sorts of unexpected side effects on
>>> other platforms though - even though philosophically it does seem the
>>> right thing to do.
>>>
>>> Option 3:
>>> ~~
>>>
>>> Make -pthread the default build option in the gcc toolset for *BSD
>>> platforms
>>>
>>> ~~~
>>
>> Seems to me like this should be reversed.  Have the config headers
>> unconditionally NOT define BOOST_HAS_THREADS, and have the Jam
>> toolsets define it when threading is requested.
>
> I don't love that idea because it ties a very boost-specific define into
> the core of Boost.Build, which is really supposed to be a general build
> system.  How will people deal with the next such define for some other
> library?

Sorry, sent prematurely.  The response above was meant to be about option
1, and I fully agree that it's not a good solution (and said so in the
text you deleted).

To finish my thoughts on the other two options...

Option 2 sounds like the right solution to me, though I'm not sure about
the purpose for _REENTRANT.  Is it expected that users will define this on
POSIX systems, or is this a define that was expected to be defined by the
implementation?

Option 3 would cause unecessary overhead, so doesn't sound like the right
solution.

William E. Kempf
[EMAIL PROTECTED]


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] threads and gcc and BSD

2003-01-23 Thread David Abrahams
"William E. Kempf" <[EMAIL PROTECTED]> writes:

> John Maddock said:
>> I think I may be the one who broke a lot of the OpenBSD regression tests
>> by defining BOOST_HAS_PTHREADS in the OpenBSD platform configuration.
>> IMO this is correct (OpenBSD supports pthreads right?), but it causes a
>> problem: currently the gcc config unconditionally defines
>> BOOST_HAS_THREADS, basically because we didn't know what else to do (gcc
>> on *BSD doesn't define anything when you build with -pthread - basically
>> defining -pthread affects only the linker, so we can't detect when to
>> turn on threading support). This in turn is breaking a lot of libraries:
>> mainly those that depend upon smart pointers, which do internal thread
>> synchronisation, and therefore need the -pthread option in order to link
>> correctly.
>>
>> What should we do about this?
>>
>> Option 1:
>> ~~
>>
>> would putting:
>>
>> flags gcc CFLAGS single : -DBOOST_DISABLE_THREADS ;
>>
>> fix the problem?
>>
>> Option 2:
>> ~~
>>
>> Add
>>
>> flags gcc CFLAGS multi : -pthread -D_REENTRANT ;
>>
>> to the toolset, and stop defining BOOST_HAS_THREADS unconditionally for
>> gcc. This one may have all sorts of unexpected side effects on other
>> platforms though - even though philosophically it does seem the right
>> thing to do.
>>
>> Option 3:
>> ~~
>>
>> Make -pthread the default build option in the gcc toolset for *BSD
>> platforms
>>
>> ~~~
>
> Seems to me like this should be reversed.  Have the config headers
> unconditionally NOT define BOOST_HAS_THREADS, and have the Jam toolsets
> define it when threading is requested.  

I don't love that idea because it ties a very boost-specific define
into the core of Boost.Build, which is really supposed to be a general
build system.  How will people deal with the next such define for some
other library?

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] threads and gcc and BSD

2003-01-23 Thread William E. Kempf

John Maddock said:
> I think I may be the one who broke a lot of the OpenBSD regression tests
> by defining BOOST_HAS_PTHREADS in the OpenBSD platform configuration.
> IMO this is correct (OpenBSD supports pthreads right?), but it causes a
> problem: currently the gcc config unconditionally defines
> BOOST_HAS_THREADS, basically because we didn't know what else to do (gcc
> on *BSD doesn't define anything when you build with -pthread - basically
> defining -pthread affects only the linker, so we can't detect when to
> turn on threading support). This in turn is breaking a lot of libraries:
> mainly those that depend upon smart pointers, which do internal thread
> synchronisation, and therefore need the -pthread option in order to link
> correctly.
>
> What should we do about this?
>
> Option 1:
> ~~
>
> would putting:
>
> flags gcc CFLAGS single : -DBOOST_DISABLE_THREADS ;
>
> fix the problem?
>
> Option 2:
> ~~
>
> Add
>
> flags gcc CFLAGS multi : -pthread -D_REENTRANT ;
>
> to the toolset, and stop defining BOOST_HAS_THREADS unconditionally for
> gcc. This one may have all sorts of unexpected side effects on other
> platforms though - even though philosophically it does seem the right
> thing to do.
>
> Option 3:
> ~~
>
> Make -pthread the default build option in the gcc toolset for *BSD
> platforms
>
> ~~~

Seems to me like this should be reversed.  Have the config headers
unconditionally NOT define BOOST_HAS_THREADS, and have the Jam toolsets
define it when threading is requested.  The reasoning is how this will
work/effect people using Boost in their own projects when they do not use
Jam for building.  But even this is an unatractive solution.

William E. Kempf
[EMAIL PROTECTED]


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
Douglas Paul Gregor <[EMAIL PROTECTED]> writes:

> Why don't we have
>
>   mpl::list list_of_types;
>   for_each(list_of_types.begin(), list_of_types.end(), f);
>
> ?
>
> Then an unqualified for_each call can handle type sequences, heterogeneous
> containers (e.g., tuple), and run-time sequences (e.g., vector). It's been
> done before, elsewhere, so why don't we do it in MPL?

It's clever, but I'm not sure what problem it's solving.  AFAICT it
doesn't solve the problem that Andrei was pointing at.  It also has at
least one problem: it is intrusive on sequence types, requiring them
to have begin()/end() member functions.  If this was the only way to
do it, it would break interoperability with 3rd-party type sequences.

-Dave

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Douglas Paul Gregor
On Wed, 22 Jan 2003, David Abrahams wrote:
> I've been talking with Aleksey recently about how to improve the
> syntactic situation without losing the separation of concerns that we
> get, but we didn't come up with anything convincingly better.  I think
> a long time ago the for_each parameter used to look like:
>
> class f
> {
> template 
> struct apply
> {
> static void execute() {...};
> };
> };
>
> IOW, a metafunction class with a nested 'execute' function.  However
> that's not really any better syntactically, it has problems carrying
> state, and it's anti-idiomatic.

Why don't we have

  mpl::list list_of_types;
  for_each(list_of_types.begin(), list_of_types.end(), f);

?

Then an unqualified for_each call can handle type sequences, heterogeneous
containers (e.g., tuple), and run-time sequences (e.g., vector). It's been
done before, elsewhere, so why don't we do it in MPL?

Doug

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: undo library

2003-01-23 Thread Andreas Nicolai
Hi Stefan!

Well you could implement it like this (if that works, didn't test it yet).
Although you would still need a wrapping undo_list class, to implement all
the undo/redo-relationship, the checks "is the undo-vector already empty"
etc., basically everything that's in my undo_list class already (at there
are quite a few bits). So in fact one would change the storage members and
change the interface for the user.

Instead of writing undo-classes with a constructor, an undo-function and a
redo-function (that makes 3) one would have to write two functions, that
take the appropriate parameters (so speaking in numbers, you would save 1
function).

BUT, when executing the undo-code one might want to add a redo-function to
the redo list and all shared properties/member-variables have to be copied
yourself:

void string_erase_undo(std::string& dest, int pos, std::string to_insert) {
dest.insert(pos, to_insert);
// now add the redo function
redolist.push_back(boost::bind(string_erase_redo, dest, pos,
to_insert(size)));
// questions: 1. What is redolist? does every undo/redo-function need to
know this?
//2. Do I really have to copy all the function parameters?
//3. Why do I (the undo function) have to add the redo
function? This is
//   multiplying the same code (in every undo and redo
function)
}

Ok, there you see some of the problems/disadvantages of this approach.

Well, there's another minor advantage of my solution. You wouldn't be
obliged to use other libraries (even though this are  boost library
elements).

Thinking it over I came to the conclusion that the derived-undo_action-class
version is the most convenient and most flexible way of doing so... but
there's surely something I forgot to think of!?

Bye - Andreas

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread David Abrahams
"Peter Dimov" <[EMAIL PROTECTED]> writes:

> From: "David Abrahams" <[EMAIL PROTECTED]>
>> 
>> I've been talking with Aleksey recently about how to improve the
>> syntactic situation without losing the separation of concerns that we
>> get, but we didn't come up with anything convincingly better.  I think
>> a long time ago the for_each parameter used to look like:
>> 
>> class f
>> {
>> template 
>> struct apply
>> {
>> static void execute() {...};
>> };
>> };
>> 
>> IOW, a metafunction class with a nested 'execute' function.  However
>> that's not really any better syntactically, it has problems carrying
>> state, and it's anti-idiomatic.
>
> The state problem is easy:
>
> struct F
> {
> template void execute();
> };

Which isn't usable portably on all broken platforms, nor is it that
different from:

  struct F
  {
  template  void operator()(T) { ... };
  };

it's-a-bag-'o'-tradeoffs-ly y'rs,
dave

-- 
   David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] undo library

2003-01-23 Thread Steven Kirk
Just one thought : couldn't much of this be achieved without having to
create your own undo classes by boost::functions and the boost::bind
library?

for example, to implement just the undo (untested code, just to give an
idea, I'm not suggesting that this wouldn't be better wrapped in an
undo_list class):

-
void string_erase_undo(std::string& dest, int pos, std::string to_insert)
{
dest.insert(pos, to_insert);
}

std::vector< boost::function > undolist;
std::string teststring = "This is a simple test of the boost undo library";

undolist.push_back(boost::bind(string_erase_undo, teststring, 10,
   std::string(teststring, 10, 7));
teststring.erase(10, 7);

// to undo:
undolist.back()()
-

> Hello there!
>
> I just wanted to ask if there would be someone interested in a framework
> library for undo/redo-functionality. In other C++ groups sometimes the
> question pops up, how to implement undo-functionality. Since I've written
> such thing as part of a programm of mine and since I have it "boostenised"
> already, I would like to introduce it briefly. Please feel free to give me
> any comments about it...
>
> Basicly there are two classes: boost::undo_list and boost::undo_action,
the
> latter is an abstract base class for any undo-function you want to
> provide...
> Instead of describing all the details I'll just give a short example of
how
> one could use the library...
> // 
> #include 
> #include 
> using namespace std;
>
> #include "undo_action.hpp"  // class boost::undo_action
> #include "undo_list.hpp"// class boost::undo_list
>
> #include "myown_undoactions.hpp"  // contains undo-action classes
>
> int main() {
> // 1. create the undo list somewhere
> boost::undo_list undolist;
> // 2. maybe you want to change the number of maximum undo steps
> undolist.set_maxundo(100);
>
> string teststring;
> teststring = "This is a simple test of the boost undo library";
>
> cout << "Original string: " << teststring << endl;
>
> // Ok, someone want's to remove a part of that string.
> // let's start with constructing the undo-action and adding that to
> // the undo list. The class StringEraseUndo is a user defined
> // undo class derived from undo_action
>
> // 3. create and add an undo action
>
> // NOTE: the constructor can look whatever the user wants it
> // to look like (see example at end of posting)
> undolist.add( new StringEraseUndo(10, 7,
> teststring.substr(10, 7), teststring) );
>
> // NOTE: All pointers added to the list make the objects
> // be OWNED by the list, thus the list is responsable
> // for cleaning up the memory
>
> // 4. perform the will-be-made-undone action
> // That means, let's finally delete that substring
> teststring.erase(10, 7);
> cout << "After erase: " << teststring << endl;
>
> // 5. and now let's make this undone...
> undolist.undo_last();
> cout << "After UNDO: " << teststring << endl;
>
> // 6. or re-done, if you like
> undolist.redo_last();
> cout << "After REDO: " << teststring << endl;
> };
> // 
>
> Well, it is obvious that the biggest problem in using the undo-library
will
> be the implementation of the user defined undo/redo-classes.
> For the example above the class StringEraseUndo could look like this:
>
> class StringEraseUndo : public undo_action {
>   public:
> // Ctor
> StringEraseUndo(std::size_t start, std::size_t size,
> const std::string& snipped, std::string& str)
> : start_(start), size_(size), snipped_(snipped), str_(str) {};
>
> virtual bool undo();
> virtual void redo();
>
>   private:
> std::size_t start_;
> std::size_t size_;
> std::string snipped_;
> std::string& str_;
> };
>
> bool StringEraseUndo::undo() {
> str_.insert(start_, snipped_);
> return true;
> };
>
> void StringEraseUndo::redo() {
> str_.erase(start_, size_);
> };
>
>
> However, since the undo-classes can be whatever they want to be, including
> non-C++-standard stuff like GUI things, this library can be used in almost
> any circumstances. The Framework, that is the undo_list and the
undo_action
> classes can still be written in plain C++ without having to know anything
> about the users environment. This clearly qualifies these classes as a
> library.
>
> Sorry for the long text, but with just describing the system shortly it
> would have caused too much confusion :-)
>
> The library itself (that is the undo_action.hpp, undo_list.hpp and
> undo_list.cpp) are ready so far. Do you think this could be a useful
> addition to the boost library?
>
> Thanks for any comments!
> Bye - Andreas
>
>
> ___
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost
>
>

___
Unsu

Re: [boost] Re: is_convertible corner case

2003-01-23 Thread Peter Dimov
From: "John Maddock" <[EMAIL PROTECTED]>
> >From Peter Dimov:
>
> >Nope, it says nothing AFAICS. A type cannot be convertible. Only values
> are.
> >And you cannot say "a value of type From is implicitly convertible to To
> >(4.0)" because you need to specify whether that value is an lvalue of
type
> >From or an rvalue of type From, and what do l- and r-values mean when
> >applied to strange (array, reference, function, abstract, etc) types.
>
> I refer you back to 4.0p3, which talks about expressions of type T, which
> are treated as lvalues if the type is a reference, otherwise as an rvalue.

Thanks.

I don't think that 4.0p3 explains everything, though. I doesn't talk about
expressions of type T. It talks about converting an expression e to type T;
it then explains that the result of that conversion is an lvalue when T
("To" in our case) is a reference type. It says that e is "used as an
lvalue" if and only if the initialization T t(e) would have used it as an
lvalue.

This still doesn't solve the "expression of type From" problem since an
expression can be either an lvalue or an rvalue, and there are no
expressions of reference types, only expressions that are lvalues. Of course
I'm not a core expert.

For example, is an expression of type int[4] convertible to int[4]? To int
(&) [4]? To int const [4]?

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] undo library

2003-01-23 Thread Andreas Nicolai
Hello there!

I just wanted to ask if there would be someone interested in a framework
library for undo/redo-functionality. In other C++ groups sometimes the
question pops up, how to implement undo-functionality. Since I've written
such thing as part of a programm of mine and since I have it "boostenised"
already, I would like to introduce it briefly. Please feel free to give me
any comments about it...

Basicly there are two classes: boost::undo_list and boost::undo_action, the
latter is an abstract base class for any undo-function you want to
provide...
Instead of describing all the details I'll just give a short example of how
one could use the library...
// 
#include 
#include 
using namespace std;

#include "undo_action.hpp"  // class boost::undo_action
#include "undo_list.hpp"// class boost::undo_list

#include "myown_undoactions.hpp"  // contains undo-action classes

int main() {
// 1. create the undo list somewhere
boost::undo_list undolist;
// 2. maybe you want to change the number of maximum undo steps
undolist.set_maxundo(100);

string teststring;
teststring = "This is a simple test of the boost undo library";

cout << "Original string: " << teststring << endl;

// Ok, someone want's to remove a part of that string.
// let's start with constructing the undo-action and adding that to
// the undo list. The class StringEraseUndo is a user defined
// undo class derived from undo_action

// 3. create and add an undo action

// NOTE: the constructor can look whatever the user wants it
// to look like (see example at end of posting)
undolist.add( new StringEraseUndo(10, 7,
teststring.substr(10, 7), teststring) );

// NOTE: All pointers added to the list make the objects
// be OWNED by the list, thus the list is responsable
// for cleaning up the memory

// 4. perform the will-be-made-undone action
// That means, let's finally delete that substring
teststring.erase(10, 7);
cout << "After erase: " << teststring << endl;

// 5. and now let's make this undone...
undolist.undo_last();
cout << "After UNDO: " << teststring << endl;

// 6. or re-done, if you like
undolist.redo_last();
cout << "After REDO: " << teststring << endl;
};
// 

Well, it is obvious that the biggest problem in using the undo-library will
be the implementation of the user defined undo/redo-classes.
For the example above the class StringEraseUndo could look like this:

class StringEraseUndo : public undo_action {
  public:
// Ctor
StringEraseUndo(std::size_t start, std::size_t size,
const std::string& snipped, std::string& str)
: start_(start), size_(size), snipped_(snipped), str_(str) {};

virtual bool undo();
virtual void redo();

  private:
std::size_t start_;
std::size_t size_;
std::string snipped_;
std::string& str_;
};

bool StringEraseUndo::undo() {
str_.insert(start_, snipped_);
return true;
};

void StringEraseUndo::redo() {
str_.erase(start_, size_);
};


However, since the undo-classes can be whatever they want to be, including
non-C++-standard stuff like GUI things, this library can be used in almost
any circumstances. The Framework, that is the undo_list and the undo_action
classes can still be written in plain C++ without having to know anything
about the users environment. This clearly qualifies these classes as a
library.

Sorry for the long text, but with just describing the system shortly it
would have caused too much confusion :-)

The library itself (that is the undo_action.hpp, undo_list.hpp and
undo_list.cpp) are ready so far. Do you think this could be a useful
addition to the boost library?

Thanks for any comments!
Bye - Andreas


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: is_convertible corner case

2003-01-23 Thread John Maddock
> >Well the wording in the standardisation proposal says:
> >
> >"value: defined to be true only if type From is implicitly-convertible to
> >type To (4.0).
> >
> >Which really says it all IMO (by reference to section 4.0 of the
standard.
>
> Gulp! In the ISO proposal???

OK it needs tightening up: in particular the preconditions need specifying
(To must not be a void, function, incomplete or abstract type, From must not
be void), and it should probably say "value: defined to be true only if an
expression of type From is implicitly-convertible to type To (4.0)."
Getting the wording right is difficult, but the semantics are intended to be
the same as 4.0p3.  Personally I would be happy if it were a precondition
that neither To nor From were void types.

>It makes sense only if you want it to make sense. That is, like almost
>all other cases, it depends on your definition of is_convertible,
>which is exactly what we miss. The fact that I had to ask means that
>the definition in the documentation is not enough, and that I must *as
>a library user* go to look at the implementation to see what happens
>in my special case. The problem is that even then I remain in doubt:
>is this just a "chance" due to the way they have implemented it or is
>it intentional? If they'll change the implementation in the future can
>the value be different so that my code is unexpectedly broken?

I agree, there should be no special cases, the wording should refer only to
the standard, not to the implementation.

>From Peter Dimov:

>Nope, it says nothing AFAICS. A type cannot be convertible. Only values
are.
>And you cannot say "a value of type From is implicitly convertible to To
>(4.0)" because you need to specify whether that value is an lvalue of type
>From or an rvalue of type From, and what do l- and r-values mean when
>applied to strange (array, reference, function, abstract, etc) types.

I refer you back to 4.0p3, which talks about expressions of type T, which
are treated as lvalues if the type is a reference, otherwise as an rvalue.

John Maddock
http://ourworld.compuserve.com/homepages/john_maddock/index.htm



___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] threads and gcc and BSD

2003-01-23 Thread John Maddock
I think I may be the one who broke a lot of the OpenBSD regression tests by
defining BOOST_HAS_PTHREADS in the OpenBSD platform configuration.  IMO this
is correct (OpenBSD supports pthreads right?), but it causes a problem:
currently the gcc config unconditionally defines BOOST_HAS_THREADS,
basically because we didn't know what else to do (gcc on *BSD doesn't define
anything when you build with -pthread - basically defining -pthread affects
only the linker, so we can't detect when to turn on threading support).
This in turn is breaking a lot of libraries: mainly those that depend upon
smart pointers, which do internal thread synchronisation, and therefore need
the -pthread option in order to link correctly.

What should we do about this?

Option 1:
~~

would putting:

flags gcc CFLAGS single : -DBOOST_DISABLE_THREADS ;

fix the problem?

Option 2:
~~

Add

flags gcc CFLAGS multi : -pthread -D_REENTRANT ;

to the toolset, and stop defining BOOST_HAS_THREADS unconditionally for gcc.
This one may have all sorts of unexpected side effects on other platforms
though - even though philosophically it does seem the right thing to do.

Option 3:
~~

Make -pthread the default build option in the gcc toolset for *BSD platforms

~~~

Any other ideas?


John Maddock
http://ourworld.compuserve.com/homepages/john_maddock/index.htm


___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Peter Dimov
From: "David Abrahams" <[EMAIL PROTECTED]>
> 
> I've been talking with Aleksey recently about how to improve the
> syntactic situation without losing the separation of concerns that we
> get, but we didn't come up with anything convincingly better.  I think
> a long time ago the for_each parameter used to look like:
> 
> class f
> {
> template 
> struct apply
> {
> static void execute() {...};
> };
> };
> 
> IOW, a metafunction class with a nested 'execute' function.  However
> that's not really any better syntactically, it has problems carrying
> state, and it's anti-idiomatic.

The state problem is easy:

struct F
{
template void execute();
};
___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Terje Slettebø
>From: "Terje Slettebø" <[EMAIL PROTECTED]>
>
> I can imagine something like this:
>
> template void Function(T)>
> struct for_each;
>
> Possibly using overloaded class templates, as well (another possible
> extension).

Come to think of it, the latter wouldn't be needed here, as for_each is a
function template, and they can be overloaded. :) That would allow different
arity for the the function template template parameter.


Regards,

Terje

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



Re: [boost] Re: MPL usage for code generation

2003-01-23 Thread Terje Slettebø
>From: "David Abrahams" <[EMAIL PROTECTED]>

> > Terje Slettebø <[EMAIL PROTECTED]> writes:
> >
> > Perhaps it might be possible to do some compile-time/run-time lambda
> > (similar to Boost.Lambda for runtime, and MPL's lambda), so you could do
> > something like:
> >
> > mpl::for_each(my_function<_>(s));
> >
> > It would then transform the function call "my_function<_>(s)" into an
> > instantiated function object of the kind suitable for mpl::for_each.
>
> I'm afraid that particular syntax won't work for this particular case,
> though.  If my_function is a function template, my_function<_> is a
> function, and my_function<_>(s) calls that function.

Yes, even with function template template parameters, the syntax would have
to be changed. I realised that you can't just pass the address of a
function, since in this case, it's a function template. Besides, it wouldn't
help to use the placeholder in that place (unless you specialised the
user-supplied function, but that would be no point). The above was just to
sketch the idea of it.

> Since there are no (function template) template parameters, only
> (class template) template parameters, there doesn't appear to be any
> way to make this one particularly easy except by using the
> preprocessor to define some kind of function object.

Yes, I realised that later, as well. Is there any good reason for not
allowing function templates as template template parameters? I think it's
amazing that we got the template facility that exists, in the standard, so
maybe it simply wasn't time to consider this, to avoid delaying
standardisation.

If this was possible, you might have done something like this, instead
(using TTP):

mpl::for_each(s);

> It appears to be just bad luck that higher order functional
> programming with function templates is impossible in C++.

Well, it might be changed in a future revision of the standard, if it turns
out to be practical.

I can imagine something like this:

template void Function(T)>
struct for_each;

Possibly using overloaded class templates, as well (another possible
extension). Anyway, this goes beyond the topic of Boost.


Regards,

Terje

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost



[boost] Re: $egression tests -- no links for Win32 errors?

2003-01-23 Thread Alisdair Meredith
Beman Dawes wrote:

> There are two other versions we might want to consider eliminating (KISS):
> 
>Messages only - Shows status only for tests with warnings or failures.
>Failures only - Shows status only for tests with failures.
> 
> I never find myself looking at those. Does anyone else use them? 

I certainly use the Messages only view, although my primary view has
become the one with differences emphasised.
If we had messages only, differences emphasised, that would probably be
my default 

I guess if I'm the only one using them though, there's no harm in
letting them go.
[I keep trying to find time to sneak in some more borland fixes, but
every time you think the schedule has cleared...]

-- 
AlisdairM
Team Thai Kingdom

___
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost