[boost] Re: variant questions

2003-08-30 Thread Gennadiy Rozental
 BTW, after looking at the implementation I was a bit disappointed to
 see two copies of the storage.  It seems to nullify one
 important reason for using variants (space savings), and it generates
 more code than a single-storage version.  I know you had some rationale
for
 that but I don't remember what it is; I hope it's in the docs along
 with some explanation of the expected size of the resulting object.

 Regards,
 Dave

Double storage is needed to ensure strong guaraty for variant. I argued need
for it before and I still believe we not nesseserily need to do that (I
remember your post on the topic, that strong guaranty is a incorrect goal
to pursue for the variant).

Gennadiy.




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


[boost] Re: POSIX, gcc, Comeau, Boost.Test, glibc

2003-08-18 Thread Gennadiy Rozental
My understanding is that Boost.Config should take care about these issues.
Boost.Test rely on BOOST_HAS_SIGACTION flag. It should not be defined in
case if there is no support for POSIX interfaces. Could you report the value
of that flag in case of compilation failures you are expiriencing.

Gennadiy.



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


[boost] Re: Proposed smart_handle library

2003-07-19 Thread Gennadiy Rozental
Hi,

I do not want to start this discussion all over again, but in the reasoning
you presenting I did not find anything new to justify another smart
pointer like component. It's only one simple case of PBSP and I do not see
any reason not to use it.

Gennadiy.



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


[boost] Re: How to achieve this goal using boost::tokenizer?

2003-07-15 Thread Gennadiy Rozental
I remember that there are 2 types of separators in boost tokenizer:
returnable and ignorable. Set - as returnable separator, and , as
ignorable. It should give you all the information you need.

Gennadiy.

lattice [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 If we print some pages ,we can select pages in a range to print.
 for example,if we enter 2,3,5-7 in Ms-word print dialog,then page
 2,3,5,6,7 is printed.
 Now questions is :
 if we get a string like this 2,3,5-7,if we use boost::tokenizer,
 we can only get 2,3,5,7. eventually some information is lost.

 How can we get the desired result2,3,5,6,7 using boost::tokenizer?




 ___
 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: test_fp_comparisons and rounding errors

2003-07-09 Thread Gennadiy Rozental

 Could you please be more specific about which Boost.Test features you
think
 should remain and which should be removed or modified? I'm having trouble
 relating the discussion to the actual Boost.Test public interface.

 Thanks,

 --Beman

The only thing I propose to change is to prohibit defining tolerance by the
number of rounding errors. User still will be able to use BOOST_CHECK_CLOSE
tool with the FP tolerance as a third parameter.

Gennadiy.



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


[boost] Re: Re: test_fp_comparisons and rounding errors

2003-07-09 Thread Gennadiy Rozental
  There is BOOST_CHECK_PREDICATE
 
 Yes, I know.
 My point was that with BOOST_CHECK_EQUAL_NUMBERS() the test library
 could output something readable of the form:

 numbers x and y are not approximately equal

 It could even add to the output something of the form:

  according to   Pred ;

This is what BOOST_CHECK_CLOSE is doing basically.

  By default, the Test library provides relative error comparator, which
is
  according to my understanding is more correct.
 
 But there is no such thing as a more correct way to compare
 FP values in the context free level of a test library.
 You know already that relative errors have to be scaled to be
 meaningful, but choosing the right scaling is the complex.
 A default semantic that simply scales epsilon() times any of the
 arguments will be simply unusable for most practical tests
 because actual errors will easily exceed that; yet OTOH,
 suppling a factor to increase the scaling will mainly lead users
 to the problematic Illusion of Simplicity that brought us
 to this discussion.

That part of interface I propose to eliminate. User will aonly be able to
define a tolearance as it is.

BOOST_CHECK_CLOSE( a, b, 1e-05 ); // 1e-05 is good enough  for my practiacal
purposes

 A comparison based on absolute errors is pesimistic, but for unbiased
 comparisons it often results on what is expected, much more often
 that relative-error based comparisons.
 It isn't smart but is easy to understand.

For majority of simple cases (not very big, nor very small values) they
should behave similarly. For egde cases relative error comparison produces
better results IMO

Gennadiy.



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


[boost] Re: test_fp_comparisons and rounding errors

2003-07-05 Thread Gennadiy Rozental
Beman Dawes [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 test_fp_comparisons has been failing for a long time. The issue has to do
 with how much tolerance to allow for rounding errors.

 The close_at_tolerance algorithm calculates tolerance as follows:

 n*std::numeric_limitsT::epsilon()/2   (1)

 where n is the number of possible floating-point rounding errors.

 The particular test case that is failing calls the comparison algorithm
 with a rounding error argument of 4. That allows for up to 2 epsilons
 tolerance.

Thanks, Beman for bringing this up. I actually was playing with this test
lately. It does indeed fail on following comparison:

I compare 0.11 with 0.11.

Left size calculated as: 11./100 (1 rounding error).
Right side calculated as: tmp = 11/10 (1 rounding error ); tmp*tmp - tmp (2
rounding errors).

In sum have 1+1+2 = 4 rounding errors. According to my understanding
relative error of calculation should not exceed tolerance calculated with
above formula 1. This statement does not hold.

What I've tried to do is to analyze the relative error/(epsilon/2) for
different compilers and FPTs. Here is the code:




templatetypename FPT
void foo( FPT* = 0 )
{
FPT tmp  = 11;
tmp /= 10;
FPT tmp1 = tmp * tmp - tmp;

FPT tmp2 = 11./100;

FPT diff = fpt_abs( tmp1 - tmp2 );

FPT d1 = diff / tmp1;
FPT d2 = diff / tmp2;

FPT r1 = d1 / std::numeric_limitsFPT::epsilon() * 2;
FPT r2 = d2 / std::numeric_limitsFPT::epsilon() * 2;

std::cout  diff=  diff  std::endl;
std::cout  epsilon=   std::numeric_limitsFPT::epsilon() 
std::endl;
std::cout  r1=   r1  std::endl;
std::cout  r2=   r2  std::endl;
}

int
main()
{
foofloat();
foodouble();
foolong double();

return 0;
}




Here is the result produced for different compilers:

Borland command line:
---
diff= 2.98023e-08
epsilon= 1.19209e-07
r1= 4.54545
r2= 4.54545
diff= 1.11022e-16
epsilon= 2.22045e-16
r1= 9.09091
r2= 9.09091
diff= 5.42101e-19
epsilon= 1.0842e-19
r1= 90.9091
r2= 90.9091

Metrowerks
-
diff= 2.98023e-08
epsilon= 1.19209e-07
r1= 4.54545
r2= 4.54545
diff= 9.71445e-17
epsilon= 2.22045e-16
r1= 7.95455
r2= 7.95455
diff= 9.71445e-17
epsilon= 2.22045e-16
r1= 7.95455
r2= 7.95455

GCC 3.2.3
---
diff= 2.98023e-08
epsilon= 1.19209e-07
r1= 4.54545
r2= 4.54545
diff= 1.11022e-16
epsilon= 2.22045e-16
r1= 9.09091
r2= 9.09091
diff= 5.42101e-19
epsilon= 1.0842e-19
r1= 90.9091
r2= 90.9091

MSVC 6.5

diff= 0
epsilon= 1.19209e-007
r1= 0
r2= 0
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455

MSVC6.5 + STLport
--
diff= 0
epsilon= 1.19209e-007
r1= 0
r2= 0
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455

MSVC7.1
--
diff= 2.98023e-008
epsilon= 1.19209e-007
r1= 4.54545
r2= 4.54545
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455
diff= 9.71445e-017
epsilon= 2.22045e-016
r1= 7.95455
r2= 7.95455

Mingw
---
diff= 2.98023e-08
epsilon= 1.19209e-07
r1= 4.54545
r2= 4.54545
diff= 9.71445e-17
epsilon= 1.11022e-16
r1= 15.9091
r2= 15.9091
diff= 9.71445e-17
epsilon= 1.11022e-16
r1= 15.9091
r2= 15.9091




As you can see It's never less then 4.

One idea, that I had, is maybe Testing tool introduce an extra error
during relative error calculation. It take an extra 6(?) operations before
comparison is performed. It still does not explain all the results above and
I am not sure it's correct.

I attached the test program for anybody interested.

Regards,

Gennadiy.


begin 666 fpt.cpp
M(VEN8VQU94@/)O;W-T+VQI;6ETRYH' ^#0HC:6YC;'5D92 \:6]S=')E
M86T^#0H-G1E;7!L871E/'1Y5N86UE($905#X-FEN;EN92!4%0-F9P
M=%]A8G,H($905!AF@*2 -GL-B @(!R971U[EMAIL PROTECTED])G(#P@, _(UA
MF@.B!AF[#0I]#0H-G1E;7!L871E/'1Y5N86UE($905#X-G9O:60@
M9F]O*!4%0J(#T@, I#0I[#0H@( @1E!4('1M @/2 Q,3L-B @(!T
M;7 @+ST@,3 [#0H@( @1E!4('1M#$@/2!T;7 @*B!T;7 @+2!T;7 [#0H-
MB @(![EMAIL PROTECTED]UP,B ](#$Q+B\Q,# [#0H-B @(![EMAIL PROTECTED]EF9B ](9P
M=%]A8G,H('1M[EMAIL PROTECTED];7 R(D[#0H-B @(![EMAIL PROTECTED]@/2!D:69F(\@
M=UP,3L-B @(![EMAIL PROTECTED](@/2!D:69F([EMAIL PROTECTED]UP,CL-@T*( @($905!R
M,2 ](0Q(\@W1D.CIN=6UEFEC7VQI;6ETSQ4%0^.CIE'-I;]N*D@
M*B R.PT*( @($905!R,B ](0R(\@W1D.CIN=6UEFEC7VQI;6ETSQ
M4%0^.CIE'-I;]N*[EMAIL PROTECTED] R.PT*#0H@( @W1D.CIC;W5T(#P\()D:69F
M/2 B( @(#P\(1I9F8@/#P@W1D.CIE;F1L.PT*( @('-T9#HZ8V]U= \
M/ B97!S:6QO;CT@(B \/!S=0Z.FYU;65R:6-?;EM:71S/$905#XZ.F5P
MVEL;VXH*2 \/!S=0Z.F5N9P[#0H@( @W1D.CIC;W5T(#P\()R,3T@
M(B \/!R,2 \/!S=0Z.F5N9P[#0H@( @W1D.CIC;W5T(#P\()R,CT@
M(B \/!R,B \/!S=0Z.F5N9P[#0I]#0H-FEN= 

[boost] test_tools_test metrowerks failure

2003-06-17 Thread Gennadiy Rozental
Hi,

I am having problems with subject test with Metrowerks compiler. I was able
to minimize the issue to the following snippet:
#include list
#include iostream

templatetypename T
inline void
print( std::ostream ostr, T const t, long ) { ostr  t; }

templatetypename T
inline void
moo( std::ostream ostr, T const t ) { print( ostr, t, 0 ); }

inline void
print( std::ostream ostr, std::listint const t, int ) {}

void foo()
{
std::listint lst;

print( std::cout, lst, 0 );  //1
moo( std::cout, lst );  //2
}

Line 1 compile successfully, while line 2 chokes.

Any Ideas?

Gennadiy.

P.S. Rest of Windows compilers I have access to seems to be happy with
above.



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


[boost] Re: Exception testing for Boost.Test incomplete

2003-06-16 Thread Gennadiy Rozental

Daryle Walker [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 While writing some other code, I checked out how some of the macros in
 Boost.Test are implemented.  The BOOST_CHECK_THROW and
 BOOST_CHECK_EXCEPTION macros flag when an intentional exception was
 missed and when the expected exception type was caught.  But what about
 when an exception of the _wrong_ type is thrown.  Shouldn't there be a
 catch(...) that notes that the wrong type was caught and re-throws the
 error?

Any operation may throw an unexpected exception. To manage this Boost.Test
runs test cases under control of the Execution Monitor. Any exception thrown
from inside a test case gets caught and reported. So I believe current
semantic of above tools is correct.

Gennadiy.



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


[boost] Re: [test] first revision to 1.30.0

2003-06-11 Thread Gennadiy Rozental

 What I meant is that the files contain data specific to your own
 programing environment (there are absolute filesystem paths in the 7.1
 project files for example). It's the reason why I was suggesting that it
 may be a mistake with CVS. If there is no mistake and if the files are
 really usable by other people having MSVC, that's fine.

No. There are no important absolute pathes there. Only intermidiate files
located forced into c:\temp\boost_test_library\. You shouldn 't have any
problems using these project locally.

Gennadiy.



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


[boost] Re: API Review request: XML APIs for C++

2003-06-11 Thread Gennadiy Rozental
 * event driven xml file parsing (sax)

I did not really used DOM to much. I may have some comments on SAX though.
Perfunctory look on your interfaces left me wondering: who does it differ
from xerces? Still xmlChar type, tons of virtual functions. We are in modern
C++ world. No need to promote such a Javish solution.

  Here is my vision on the problem, couple ideas on XML parser design:
1. No xmlChar type - template parameter

namespace xml {
templatetypename Ch, typename Tr
class parser {...};
}

2. No hardcoded virtual functions. In some refinements it still may come to
use virtual functions here and there. One way to achieve this is to supply
implementation as template parameter:

namespace xml {
templatetypename HandlerImpl
class parser : public HandlerImpl {...};
}

3. Most probably above may not be good enough. For better reusability let
then use multiple template parameters for different types of handlers:

namespace xml {
templatetypename DocumentHandler, typename ErrorHandler, typename
DTDHandler, ...
class parser : public foo( DocumentHandler, ErrorHandler, DTDHandler, ... )
{...};
}

meta function foo should deduce the correct type to inherit from. We may
want to take into an account the fact that if the same type is used as both
document and error handler, we don't want to inherit twice.
 Also above interface definitely asks for named template parameters.

4. There maybe several flavors of document handlers. One simple: as usual
concrete handler needs to expose methods like on_start_element and accept
the name plus attributes. As an alternative we may consider document
handlers supporting named callbacks (in a form of boost::function...)
registration. IOW such handler would call a callback when element with
desired name encountered. There are other alternatives.

This way I believe we could create fastest and convenient parser.

I am sure that there also could be Spirit-based or Spirit-like solution.
Check with the Spirit guys.

Regards,

Gennadiy.



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


[boost] [test] first revision to 1.30.0

2003-06-10 Thread Gennadiy Rozental
Hi,

I finally mostly finished first long promised revision for Boost.Test.

Here is the list of major features/updates:

* Major update for documentation
  I still think that docs need a lot of work. They incomplete and there are
several pages missing. Also some tutorial material needs to be extended. I
reworked documentation structure. All suggestions and comment in this regard
are welcome.

* BOOST_CHECK_EXCEPTION
  New tool allows not only check that desired exception has thrown, but also
validate a predicate with an exception as an argument.

* Test cases/suites dependency support
  Now one should be able to say: do not run this test case/suite unless
that test case passed
  Syntax:
 test_case_1-depend_on( test_case_2 );

* zero arity function template based test case.
This is the case met several times in boost libraries tests: run some
function several times with different template parameter as an template
argument. Unfortunately due to some C++ limitation I did not find a solution
with out extra out of function support. Here is the syntax:

templatetypename T
void my_foo( ) // add parameter T* =0 if you want it to work under MSVC 6.5
{
  ...
}

BOOST_META_FUNC_TEST_CASE( my_foo );

...

test-add( BOOST_FUNC_TEMPLATE_TEST_CASE( my_foo, types_list ) );

Above statement will make the framework to run the function my_footype(),
instantiated with all types in provided as a second argument type list.

* Smart predicates support
In some cases users want to be able to perform complex check and in
combination with result to return error message with explanation
I moved extended_predicate_value into public interface. Now used could
return instance if this class that could hold boolean value and error
message from a predicate. The framework will use the supplied error message
for error logging

* Support for non-printable types
In some cases users forced to use less descriptive tools because more
descriptive would require presence of the output operator()
For example:
std::listint my_list, expected_list;
...

BOOST_CHECK_EQUAL( my_list, expected_list );

Now this does not work cause std::listint does not have an operator()
defined. To address this I added extra decision point which function to use
to print the value. One could overwrite this function to use custom print
mechanism. Also helper macro
BOOST_TEST_DONT_PRINT_LOG_VALUE( type_name ) introduced, that automatically
prevent compilation error in above case. Use it outside of test function
definition

BOOST_TEST_DONT_PRINT_LOG_VALUE( std::listint )



BOOST_CHECK_EQUAL( my_list, expected_list ); // Now works

BOOST_CHECK_EQUAL( my_list, expected_list );

* many bug fixes and minor enhancements


Update is available in cvs. Let me know about any issues.

Regards,

Gennadiy.



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


[boost] Re: [patch] Boost.Test and BOOST_DISABLE_WIN32

2003-06-09 Thread Gennadiy Rozental

Giovanni Bajo [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 Hello,

 Boost.Test does not currently honor BOOST_DISABLE_WIN32. The attacched
patch
 fixes it. Can someone review  apply this patch?

 Thanks
 Giovanni Bajo

Ok. Applied.

BTW, Beman, You recently disabled structured exceptions support for Comeau.
Are you sure it does not work in any configuration? I remember seeing
references online on Comeau structured exceptions support. And if it indeed
does not work should we define above macro then?

Gennadiy.





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


[boost] Re: compiler status page proposition

2003-06-09 Thread Gennadiy Rozental

 Regardless, do this: make a copy of one of the status tables, hand change
 the entries for the first couple of libs to illustrate what you want,
 verify it works with a browser, and send it to me.

Maybe like this.

Gennadiy.


begin 666 Boost Compiler Status Automatic Test.htm
M/%$3T-465!%([EMAIL PROTECTED]3$E#((M+R]7,T,O+T141!(5$U,(#0N,!4
MF%NVET:6]N86PO+T5.(CX*/$M+2!S879E9!FF]M('5R;#TH,# U-BEH
M='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T+W)E9W)EW-I;VXM;]GR]C
M[EMAIL PROTECTED]:'1M; M+3X*/$A434P^CQ(14%$/@H\5$E43$4^0F]O[EMAIL PROTECTED]
MEL97(@4W1A='5S($%U=]M871I8R!497-T/]4251,13X*/$U%5$$@:'1T
MUE75I=CTB0V]N=5N=U47!E(B!C;VYT96YT/2)T97AT+VAT;6P[(-H
M87)S970]=VEN9]WRTQ,C4Q(CX*/[EMAIL PROTECTED]5N=#TB36ECF]S;V9T
M($9R;VYT4%G92 U+C B(YA;64](D=%3D52051/4B(^CPO2$5!1#X*/$)/
[EMAIL PROTECTED]5X=#TB(S P,# P,(@8F=C;VQOCTB(V9F9F9F9B(^CQ404),12!B
M;W)D97(](C B/@H@(#Q40D]$63X@B @/%12/B *( @(#Q41#X\24U'(AE
M:6=H=#TB.#8B('-R8STB8RLK8F]OW0N9VEF(B!W:61T:#TB,CW(B!B;W)D
M97(](C B/CPO5$0^B @( \5$0^( H@( @( \2#$^0V]MEL97(@4W1A
M='5S.B!)[EMAIL PROTECTED]/](,3X*( @( @/$(^4G5N($1A=4Z/]/B P-CHP
M,SHP-!55$,L($UO;F1A2 P.2!*=6YE(#(P,#,@B @( @(#Q0/E1EW0@
MG5N('5N95R($E32!!:7@@-2XQ3 \0E(^B @( @( @;W-L979E; U
M,3 P+3 T+!6:[EMAIL PROTECTED]($UA2 R,# S(#Q4CX*( @( @(!E
M=F5R[EMAIL PROTECTED]@-F%M($-%5[EMAIL PROTECTED]@5]O;B!+;F%P96X\+U ^B @( \
M+U1$/@H@(#PO5%(^B @/]40D]$63X@CPO5$%3$4^CQ4CX*/%1!0DQ%
M(-E;QS%C:6YG/2(P(B!C96QL%D9EN9STB-2(@8F]R95R/2(Q(CX*
M( \5$)/1%D^( H@(#Q44CX@B @( \5$0@/E1E[EMAIL PROTECTED]B @
M( \5$0^/$$@:')E9CTB:'1T#HO+V)O;W-T+G-O=7)C969OF=E+FYE=]R
M96=R97-S:6]N+6QO9W,O8V]MEL97)?W1A='5S+FAT;6PC=5S=UT7!E
M(CY497-T(%1Y4\+T$^/]41#X*( @(#Q41#YV86-P#Q4CX*( @( @
M-C P/]41#X*( \+U12/@H@(#Q44CX@B @( [EMAIL PROTECTED]W!A;CTB,R(@
M/B *( @( @/% @86QI9VX](F-E;G1EB(^/$$@:')E9CTB:'1T#HO+V)O
M;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V%N2(@;F%M93TB86YY(CYB;V]S
M=#HZ86YY/]!/CPO4#X*( @(#PO5$0^B @/]44CX*( \5%(^( H@( @
M/%1$(#X\02!HF5F/2)H='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T+VQI
M8G,O86YY+V%N5]T97-T+F-P(^86YY7W1EW0\+T$^/]41#X*( @(#Q4
M1#YR=6X\+U1$/@H@( @/%1$/E!AW,\+U1$/@H@(#PO5%(^B @/%12/B *
M( @(#Q41!C;VQS%N/2(S(B ^( H@( @( \4!A;EG;CTB8V5N=5R
M(CX\02!HF5F/2)H='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T+VQI8G,O
M87)R87DB(YA;64](F%RF%Y(CYB;V]S=#HZ87)R87D\+T$^B @( \+U1$
M/@H@(#PO5%(^B @/%12/B *( @(#Q41 ^/$$@:')E9CTB:'1T#HO+V)O
M;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V%RF%Y+V%RF%Y,2YC' B/F%R
MF%Y,3PO03X\+U1$/@H@( @/%1$/G)U;CPO5$0^B @( \5$0^4%SSPO
M5$0^B @/]44CX*( \5%(^( H@( @/%1$(#X\02!HF5F/2)H='1P.B\O
M8F]OW0NV]UF-E9F]R9V4N;F5T+VQI8G,O87)R87DO87)R87DR+F-P(^
M87)R87DR/]!/CPO5$0^B @( \5$0^G5N/]41#X*( @(#Q41#Y087-S
M/]41#X*( \+U12/@H@(#Q44CX@B @( \5$0@/CQ!(AR968](FAT=' Z
M+R]B;V]S=YS;W5R8V5F;W)G92YN970O;EBR]AG)A2]AG)A3,N8W!P
M(CYAG)A3,\+T$^/]41#X*( @(#Q41#YR=6X\+U1$/@H@( @/%1$/E!A
MW,\+U1$/@H@(#PO5%(^B @/%12/B *( @(#Q41 ^/$$@:')E9CTB:'1T
M#HO+V)O;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V%RF%Y+V%RF%Y-YC
M' B/F%RF%Y-#PO03X\+U1$/@H@( @/%1$/G)U;CPO5$0^B @( \5$0^
M4%SSPO5$0^B @/]44CX*( \5%(^( H@( @/%1$(#X\02!HF5F/2)H
M='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T+VQI8G,O87)R87DO87)R87DU
M+F-P(^87)R87DU/]!/CPO5$0^B @( \5$0^G5N/]41#X*( @(#Q4
M1#Y087-S/]41#X*( \+U12/@H@(#Q44CX@B @( [EMAIL PROTECTED]W!A;CTB
M,R(@/B *( @( @/% @86QI9VX](F-E;G1EB(^/$$@:')E9CTB:'1T#HO
M+V)O;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V)I;F0B(YA;64](F)I;F0B
M/F)O;W-T.CIB:6YD/]!/B *( @(#PO5$0^B @/]44CX*( \5%(^( H@
M( @/%1$(#X\02!HF5F/2)H='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T
M+VQI8G,O8FEN9]L:6)S+V)I;F0O=5S=]B:6YD7W1EW0N8W!P(CYB:6YD
M7W1EW0\+T$^/]41#X*( @(#Q41#YR=6X\+U1$/@H@( @/%1$/E!AW,\
M+U1$/@H@(#PO5%(^B @/%12/B *( @(#Q41 ^/$$@:')E9CTB:'1T#HO
M+V)O;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V)I;F0O;EBR]B:6YD+W1E
MW0O;65M7V9N7V1EFEV961?=5S=YC' B/FUE;5]F;E]D97)I=F5D7W1E
MW0\+T$^/]41#X*( @(#Q41#YR=6X\+U1$/@H@( @/%1$/E!AW,\+U1$
M/@H@(#PO5%(^B @/%12/B *( @(#Q41 ^/$$@:')E9CTB:'1T#HO+V)O
M;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V)I;F0O;EBR]B:6YD+W1EW0O
M;65M7V9N7W1EW0N8W!P(CYM96U?9FY?=5S=#PO03X\+U1$/@H@( @/%1$
M/G)U;CPO5$0^B @( \5$0^4%SSPO5$0^B @/]44CX*( \5%(^( H@
M( @/%1$(#X\02!HF5F/2)H='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T
M+VQI8G,O8FEN9]L:6)S+V)I;F0O=5S=]M96U?9FY?=F]I9%]T97-T+F-P
M(^;65M7V9N7W9O:61?=5S=#PO03X\+U1$/@H@( @/%1$/G)U;CPO5$0^
MB @( \5$0^4%SSPO5$0^B @/]44CX*( \5%(^( H@( @/%1$(-O
M;'-P86X](C,B(#X@B @( @(#Q0(%L:6=N/2)C96YT97(B/CQ!(AR968]
M(FAT=' Z+R]B;V]S=YS;W5R8V5F;W)G92YN970O;EBR]C;VYC97!T7V-H
M96-K(B!N86UE/2)C;VYC97!T7V-H96-K(CYB;V]S=#HZ8V]N8V5P=%]C:5C
M:SPO03X@B @( \+U1$/@H@(#PO5%(^B @/%12/B *( @(#Q41 ^/$$@
M:')E9CTB:'1T#HO+V)O;W-T+G-O=7)C969OF=E+FYE=]L:6)S+V-O;F-E
M'1?8VAE8VLO8VQAW-?8V]N8V5P=%]C:5C:U]T97-T+F-P(^8VQAW-?
M8V]N8V5P=%]C:5C:U]T97-T/]!/CPO5$0^B @( \5$0^8V]MEL93PO
M5$0^B @( \5$0^4%SSPO5$0^B @/]44CX*( \5%(^( H@( @/%1$
M(#X\02!HF5F/2)H='1P.B\O8F]OW0NV]UF-E9F]R9V4N;F5T+VQI8G,O
M8V]N8V5P=%]C:5C:R]C;%SU]C;VYC97!T7V9A:6Q?97AP96-T960N8W!P
M(CYC;%SU]C;VYC97!T7V9A:6Q?97AP96-T960\+T$^/]41#X*( @(#Q4
M1#YC;VUP:6QE7V9A:6P\+U1$/@H@( @/%1$/CQ!(AR968](FAT=' Z+R]B
M;V]S=YS;W5R8V5F;W)G92YN970OF5GF5SVEO;BUL;V=S+V-S+4%)6UL
M:6YKRYH=UL(V-L87-S7V-O;F-E'1?9F%I;%]E'!E8W1E9!V86-P(^

[boost] Re: Problem: gcc 2.95: undefined reference to `test_main(int, char **)'

2003-05-30 Thread Gennadiy Rozental
 /// START CODE ///
 // Boost Unit Test Library:
 #include boost/test/unit_test.hpp
 #include boost/test/included/test_exec_monitor.hpp

You included  test_exec_monitor.

 // Individual Components:
 // None - just a clean compile would be nice!

 using namespace boost::unit_test_framework;

 test_suite* init_unit_test_suite(int argc, char* argv[]) {

You want to use unit test framework.

 test_suite* test= BOOST_TEST_SUITE(testtest);
 return test;
 }
 // END CODE 

You should use
#include boost/test/included/unit_test_framework.hpp

Gennadiy.




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


[boost] Re: MPL regression tests?

2003-05-29 Thread Gennadiy Rozental
 There are 65 tests in that directory. Multiply that by 7 or 8 compilers,
 and it would be a huge additional testing load.

IIRC they all compile-time small tests. There should not be any problems.

Gennadiy.



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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
 I think the names arguments and options are as good as anything else.

It may be so. But I do not understand how the library use these terms.

Vladimir wrote:
 option is (name,value) pair
 argument is an command line element which is not option.

These definitions unclear to me. Could you give me more explanations with
examples.
Also I would like to know what term parameter means and what is the
difference between parameter name and option name.


Gennadiy.




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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
 While I don't find the interface proposed by Vladimir to be offensive,
 when you get a pile of function arguments of the same type together a
 named parameter interface *can* be a help.  I don't think I'd use
 operator, though.  If it's really about readability I'd tend to
 sacrifice some non-intrusive extensibility for a cleaner syntax:

  parameterstd::string( output )
.place_to( output_file_name )
.default_value( /tmp/abc )
.description( output file name )
;

I showed example out of context.

In fact my interface would look like this:
cla::parser... p;
 p  ignore_mismatch
 named_option( version )
 place_to( show_version  )
 description( ...)
named_parameterint( trace_level )
 default_value( 1 )
 place_to( g_trace_level )
 description( ...)
...

templatetypename Toperator( cla::parser..., T ) is the only interface
currently supported for both parameters and modifiers.

I may consider other propositions.

 But anyway, neither of these looks like a huge win over a function
 which simply takes 3 parameters.  Probably the complexity isn't
 justified.

There maybe significantly more modifiers for parameter. For example:
optional, multiplicable, separator. Now you need to deal with 7 values.
Also I in fact believe that my version is simpler, cause only one interface
function required.

 Dave Abrahams

Gennadiy.




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


[boost] Re: command line parser review

2003-05-29 Thread Gennadiy Rozental

 For a command line parser, the decoupling provided by separate
 compilation seems to far outweigh the minor benefits of a header-only
 implementation. Just my opinions, of course.

We do not need to sacrify decoupling to provide both header based and
offline versions.

Gennadiy.




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


[boost] Re: How to add automated testing?

2003-05-29 Thread Gennadiy Rozental
Daryle Walker [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 In a revamp of the I/O library reviewed a few months ago, I revised the
 structure of the test programs to match that given in the Boost.Test
 documentation.  Is what I have alright?  Someone (Beman?) mentioned the
 desire for Jamfiles; but I don't use Jam, so I don't know if that's
 needed for arranging automated tests.  (My platform, Mac OS X, can do
 Jam if I want to switch.)

If by automated testing you mean to include your tests into regression
testing, you do need a Jamfile for that.
In most cases it's really simple. Take a look on somebody's test directory
Jamfile for example. Or Boost.Build docs.

Gennadiy.




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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
 And one important point: there are only three unnamed parameters. There's
a
 bunch of other things that can be configured, and they all use *named*
 interface:

desc.add_options()
(output, file, output file name).default_value(/tmp/abc)
;

The question arize: Why do you prefer option description to defalt value,
optional and other modifiers (I still could not reveal the mystery of second
parameter, so couldn't comment here). I prefer treat them all same way.

Gennadiy.





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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
 Consider command line

my_prog --output=/tmp/log input.cpp

 Here is the option with name output and value /tmp/log. There's also
 argument input.cpp.

1. Why you named namespace progrma_options it in fact you supply both.
2. How could I access argument using high level
variable_map/option_description interface
3. What is add_argument method in options_and_arguments

  Also I would like to know what term parameter means and what is the
  difference between parameter name and option name.

 The term parameter is undefined yet :-( It's used only as the name of
 'parameter' function, and there's something wrong with this name.

Term parameter is also actively used in class class cmdline

Gennadiy.




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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
 OK, I understand your opinion. I'm probably misusing you don't pay for
what
 you don't use principle, but I find that 'options_and_argument' class is
 important. Sometimes you really don't need typed storage.

Then just use default std::string type for parameter types - you got your
string to string parser.
IMO options_and_arguments is redundant.

 It's possible to link several variables_map instances in a chain, which
 handles the primary need: different preference of options from different
 sources. It's true that different naming of options is not handled,
however
 I'm still considering if it's better to do that in parsers.

I do not say it should be done in parsers. But this is only one conflict
resolution strategy. There may be many more. And what important different
parameters may have different strategy: for trace level we prefer CL value
to the environment. For debug/release mode switch we may want to use and
or or logic.

  In my terms above would look like this:
 
  parameterstd::string( output )
 place_to( output_file_name )
 default_value( /tmp/abc )
 description( output file name )
 
  You do not need to know anything in addition about how  parser works.
  Moreover  it's unifies and easily extendable to adopt different
modifiers.

 It seems we'll make no progress with this question. I find your syntax
more
 verbose, and it still leaves questions. What if I have --output foo
 --output bar or

Parameter above is not declared multipliable.

 when does default value plays: can I write simply
 --output, without any value?

No. This is parameter. It's required to have a value. Seems obvious to me.
If not parser will generate the error.

   I don't see here handling of response files or config files... if you
  were
  to add it, would you write the same if block a couple of times?
 
  I may have several if statements:
  if( cla_parser.parse(...) ) ...
  if( config_file.parse(...) ) ...
  ...
 
  It's not worse than several catch clauses. Try/catch seems redundant
when
  used right aroung the function that throw an exception.

 But it's worse than *one* catch clause --- which can be the 'catch' clause
 already present in your 'main' function (at least in my 'main' functions).

It's unfair comparison. I could also write one if:

if( ! cla_parser.parse(...) || ! config_file.parse(...) ) ...

But I most probably would not want to do so, cause I want to show different
messages depends on what failed.

To be more close to the topic, could you show any practical usage for the
exception classes you defined in error.hpp.

  I don't get it. What long name would I use if it only have short name.

 Whatever long name you like. You've been talking about maintenance
 programmer previously. Now imagine he looks at

vm[-u].asint()

 Fine, what does it mean? Would anyone like to write such cryptic code? A
 better idea is write

vm[unified_context_lines].asint()

 Now, unified_context_lines is the long name, used in program. You can
have
 only -u in command line, no problem.

But parameters definition does not contain unified_context_lines name at
all. So it's questionable what is more confusing: see unreadable name that
you can find among defined parameters or use readable name that is not
mentioned there. I believe that if programmer was that smart to use short
names for command line arguments declaration the same names should be used
everywhere.

   I may not have short name but only long one, like the style I am
   personally prefer.
 
  What's problem with this case? It's supported out-of-box.
 
  What would you return when user call short name method?

 You mean option_description::short_name()? Empty string will be returned.
 What's wrong with that?

This methods is redundant in this case. IMO there should not be redundant
methods in any way library is used.

Gennadiy.



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


[boost] Re: CLA/Config file library opinion

2003-05-29 Thread Gennadiy Rozental
Vladimir Prus [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 Gennadiy Rozental wrote:

  And one important point: there are only three unnamed parameters.
There's
  a
  bunch of other things that can be configured, and they all use *named*
  interface:
 
 desc.add_options()
 (output, file, output file name).default_value(/tmp/abc)
 ;
 
  The question arize: Why do you prefer option description to defalt
value,
  optional and other modifiers (I still could not reveal the mystery of
  second parameter, so couldn't comment here). I prefer treat them all
same
  way.

 I though I've told it to you previously: because uniform syntax will be
much
 more verbose

I would not say much more. From what I view the only difference is
'description' modifier.

 - Volodya

Gennadiy.




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


[boost] CLA/Config file library opinion

2003-05-26 Thread Gennadiy Rozental
Hi,

  This is not a review of the supplied library. I am not gonna discuss docs
even though they are scarce. I almost don't mention implementation/code/
testing. I just want to express my opinion on design of the library.

  Following list is not ordered by importance nor any other order. It just
list of my points:

1. Terminology
   Terminology chosen by author is confusing to me. In my understanding:
  term parameter - originated from 'formal parameter, formal
description of the expected value
  term option   - special case of parameter that describe
parameters with boolean values
  term argument   - originated from 'actual argument', actual value
passed as expected value
The way these terms are used in library does not seems to follow above
definitions.

2. Layered design.
   The task in hand indeed ask for the layered design. But design
presented in library does not come close to what I understand under this
term. Let's see what are the layers and their purpose
a. First layer cmdline/config_file. It allows parsing argc/argv
producing list of pairs of string. It does not know anything about
description correct types and so on. The question is: why would I want in
practice to use this layer standalone, instead of program options with all
types defaulted to string? Why not hide this class into implementation
details?
b. Second layer declared in design is class options_and_arguments. What
this class adds to the cmdline functionality (other than unnecessary copy of
huge object - not that performance is that important, but still) and why it
could not be implementation detail of the class cmdline unclear to me.
c. Third level declared is program options. Looks like the only usable
layer to me.
d. Finally variable_map - third place where actual argument are stored
(Number of places where actual value is stored looks redundant). Why would I
want to use this class if I need only CLA parsing unclear to me.
Multi-source case discussed below.

So, from what I view there is only one layer presented in library design
that fits the real needs. While IMO it should be several.

3. Variety of different name/value syntaxes support
   Library struggle to support most used syntaxes for the CLA processing. I
am not gonna say that any specific style is missing. Let's better see how
this support is designed. class cmdline is responsible for all syntax
related tasks. The only way to select non-default style is to provide some
bitmask of desired styles in constructor (BTW, I did not see an example of
usage custom style with variable map - is it possible?). This has many
problems:
   a. Limit number of supported styles die to bitmap limitation
   b. Force same style for all parameters in command line (I could not
define /h --my_long_param)
   c. This kind of design when one class is responsible for many different
styles *always* leeds to macaroni style unreadable code. See on cmdline
implementation: endless list of if, else, and switch. And with only minimal
number of styles (IMO) supported. How it will look in a year when author
adopt all requests from users I could only imagine. IMO this is not a kind
of style we want to promote.

4. Parameter definition.

First of all I want to remark that there are in fact to ways to define a
parameters in  reviewed library. And both are not what I am looking. Program
parameter definition is not repetitive task. We do it once, somewhere in
program main most probably. As a developer or maintainer looking on
unfamiliar code in need to see what are the parameters it supports, I want
to read parameters descriptions like a poem, without need to solve a puzzle
or guess implicit rules. From this rationale I believe that primary
interface for parameter definition should be as verbose as possible. You may
supply shortcuts for lazy programmer, but only as a second option. You may
laugh, but even after several ours I spent with library I still could not
figure out what second parameter in (name, , ) is. Parameter
description should be clear to anybody who never read your docs.

5. Code organization
   Library implemented as an external library. IMO it's unacceptable for
such basic component like CLA processing. test programs just a small part
among all programs, but I still got numerous complains about absence of the
inline version. Related topic is dependencies: IMO library implementation
use too many dependencies, which became important once you use it inline.
Though it's subtle point.

6. cmdline - container or iterator?

Looking on class cmdline one will be puzzled: what king of design if follow?
Is it container of iterator? Seems like both. If I remember correctly this
is how some ancient pre-standard, or RW containers were implemented. I don't
believe this is kind of design we want to promote.

7. Overblown interfaces

In my taste interface to many major classes unreasonably overblown, which is
not a kind of practice we should promote. See cmdline and 

[boost] Re: BOOST_CHECK_EQUAL_COLLECTIONS proposal

2003-04-04 Thread Gennadiy Rozental
svertka.driver.cpp(127): error in test_svertka: test {result.begin(),
  result.end()} == {result2, ...} failed [-431600044 != -78651042]

 I think this message misses one thing: the position where mismatch
occured. If
 differing values are printed, it's natural to print position, too.
Gennadiy,
 how do you think?

I could probably add  at position N  after failed, though it would make an
comparisons implementation much more intricate.

Gennadiy.



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


[boost] Re: Variant Library: visitation algorithm

2003-04-04 Thread Gennadiy Rozental

Eric Friedman [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 Gennadiy Rozental wrote:
   While I do agree O(1) is better than O(N), I would like to point out
 that
   it is usable only when the pseudo-variadic template interface is used
 (i.e.,
   variantT1, T2, ..., TN as opposed to variantTypes).
 
  Why? And to be absolutely clear: what do you mean by it?

 By it I mean the use of a switch, as you propose.

 If variant is given types as a MPL-sequence (e.g., variant mpl::listT1,
 T2, ..., TN  instead of variantT1, T2, ..., TN), then technique you
 propose will not work. Please prove me incorrect, but I don't think you
can.
 (Note, however, that loop-unrolling is still possible, though ultimately
it
 doesn't change the O(N) complexity of visitation.)

I don't think there is a differrence. In both cases we either rely on actual
number of types that need to be computed (IOW is not sutable for PP) or on
upper limit of types amount (that is PP constant in both cases).

Here how  the second case could be implemented:

templatetypename Typelist, typename Storage,typename Visitor
void switch_visitor_selector( Storage storage, int witch, Visitor visitor )
{
  switch( witch ) {
  case 1:
   visitor( Typelist[1](storage) );
   break;
  case 2:
   visitor( Typelist[2](storage) );
   break;
  ...
  case MAX_WITCH:
   visitor( Typelist[MAX_WITCH](storage) );
   break;
  }
}

  I do not know how smart are modern optimizers. But in general my
  understnding was that if-else form should use O(N) comparisons, while
 switch
  form should be compiled into jump with some computed offset.

 I'd be interested to know more about these assumptions before I spend a
 great deal of time writing code based upon them.

Does anybody familiar with modern compiler design could confirm/deny above
statement. I will try to dig something myself.

Gennadiy




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


[boost] Re: Re: Variant Library: top level const types

2003-04-04 Thread Gennadiy Rozental
 I argue that top-level const type arguments are meaningless in the context
 of variant. Given the example you provide:

   typedef boost::variantint const, std::string const GlobalParameter;

   GlobalParameter input_socket(12345);
   input_socket = 54321; // no way to prevent this!!

How come!? It should be very easy to prohibit all mutating operations for
variant once it has top level const bound types (with static asserts)

 We can put it in the docs, but it seems straightforward that a const
variant
 would, in fact, not allow modification. What reason would lead someone to
 believe otherwise?

No. I meant that: Would we decide to keep the current semantic (without top
level const) we need to say explecetly what to do to define variant type for
constant object.

Gennadiy



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


[boost] Re: Variant Library: visitation algorithm

2003-04-04 Thread Gennadiy Rozental
case MAX_WITCH:
 visitor( Typelist[MAX_WITCH](storage) );
 break;
}
  }

 Your pseudo-code is misleading. There is no MAX_WHICH available to the
 preprocessor when MPL-sequences are given because there is no theoretical
 upper limit on the size of a type-sequence.

1. There is theoretical limits for the size of MPL sequences. See MPL docs
(BOOST_MPL_LIMIT_LIST_SIZE for list)
2. You could limit variant support only for lists that does not exceed your
own limit BOOST_VARIANT_LIMIT_TYPES.
3. You could choose/define any other arbitrary limit (it should probably
exceed limits mentioned in items 1 and 2)

All you need once you chose the limit is to add default clause to above
switch statement with static assert in it. So I believe my code is perfectly
implementable.

Gennadiy.



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


[boost] Re: Variant Library: variant size and strong guaranty

2003-04-04 Thread Gennadiy Rozental
  2. Could type that implements swap() method somehow follow the second
case
  road also? For example, could you somehow deduce T* from buffer and swap
 it
  with local copy of the argument?

 Yes, I can look into such optimizations. But as I noted in previous
 messages, if I can prevent double-storage only for incompleteT (a point
on
 which I'm not certain is even true), it's probably not worthwhile. After
 all, sizeof(incompleteT) == sizeof(T*), so double-storage means
 2*sizeof(T*).

So the tradeoff here is extra 4 bytes for the object size plus double
indirection for all access operations. Here the question arise then why not
use virtual function based solution then? I bet it will be incomparably more
simple to understand and probably easier to use.

Gennadiy.



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


[boost] Re: Variant Library: access interface

2003-04-03 Thread Gennadiy Rozental
  templatetypename T
  void foo( T const )
  {
   
  }
 
  int main()
  {
  boost::variantint,. v = 5;
 
 // Here I want to pass const reference to integer value of variant to
  function foo
// foo( getint( v ) ); - type T is incorrect
 foo( ??? );
  }

 I don't see why this wouldn't work. What is incorrect regarding type T?

Try to compile and run this:
#include iostream

templatetypename T
void
foo( T const )
{
   std::cout  typeid(T).name()  std::endl;
}

templatetypename T
struct get {
operator T() { return m_t; }

T m_t;
};


int main()
{
   foo( getint() );
}

 I see it as the difference between dynamic_cast with a reference type
versus
 a pointer type. That is, the reference-based dynamic_cast throws, which as
 you note, works fine. But the pointer-based dynamic_cast provides a
 non-throwing mechanism as well (returns a null pointer). Thus,
 extract::check is the non-throwing analogue for extract.


I don't argue that it may be used. I argue that it will be rarely used. In
most cases when you access your variant you either know what type it holds
by inspecting it's which() result or will use some kind of visitation. You
may provide this form of value access but only as an addition to free form
one.

Gennadiy.




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


[boost] Re: Variant Library: reflection

2003-04-03 Thread Gennadiy Rozental
 If the issue concerns you this much, you might propose something along the
 lines of BOOST_NO_EXCEPTIONS.

 That is, you might try: BOOST_NO_RTTI anyone?

  - Eric

I did. As a user defined parameter. Terrie made a point that it should be
config parameter cause some embedded compiler indeed does not provide this
functionally (maybe because it's taking too much space to implement?). No
consequences yet.

Gennadiy.




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


[boost] Re: Variant Library: top level const types

2003-04-03 Thread Gennadiy Rozental
 I think you misunderstand: What I'm arguing is that the usage case you
 propose here is itself erroneous. This is *not* an issue of whether I can
 implement the behavior. (In fact, I need to do additional work to prohibit
 it.)

 Let me know if you still disagree.

I disagree. Let say I want to define type that will hold constant parameter
that is represented either as constant int value or constant string that
could be used to lookup the value in some kind of global table.
So what I want is

typedef boost::variantint const,std::string const GlobalParameter;

GlobalParameter input_socket( 12345 ); // localhost::12345
GlobalParameter output_socket( MultiplexorSocket );

Is there anything wrong in such design?

Gennadiy.




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


[boost] Re: Variant Library: variant size and strong guaranty

2003-04-03 Thread Gennadiy Rozental
   overview.) This technique is necessary to provide a general guarantee
   of strong exception-safety, which in turn is necessary to maintain
   a never empty invariant for variant.
 
  What is this invariant? And why is it that important.

 The invariant is quite straightforward: any object of type variantT1, T2,
 ..., TN contains exactly one object of type T1, T2, ..., or TN.

From this it seems that in above passage (This technique is necessary ...)
you switched an order of importance:
In fact you need double storage to implement never empty invariant (in
other case you would need during copy/assignment to first destroy current
object), that is necessary to implement strong guaranty.
Isn't it?

 I am well aware, of course, of the trade-offs made by the use of this
 technique. Thus the decision is not set in stone, and I'd be willing to
 consider arguments against it.

 I will make two final notes, however.

 1) In addition to its role in enabling recursive variants,
 boost::incompleteT provides a convenient way to increase space
efficiency
 (though at the expense of speed efficiency due to heap allocation). Note
 though that this is only because incomplete wraps a T*, which is small. It
 does *not* disable the double-storage technique.

 2) For every type supporting non-throwing move operations, I have
 implemented variant to use single-storage. As a (trivial) proof of this,
 boost::has_nothrow_copy types *do* currently avoid the double-storage
 overhead.) Of course, until Boost.Move becomes a reality this is nearly
all
 but meaningless for the vast majority of types.

Several notes:

1. Intrinsic types have nothrow move constructor, so should follow second
case road. Isn't it?
2. Could type that implements swap() method somehow follow the second case
road also? For example, could you somehow deduce T* from buffer and swap it
with local copy of the argument?
3. Could you use placement copy into local to assign storage and then
memcopy it to variant storage? It wouldn't work with all types but may work
in many cases isn't it? Here we would have different tradeoff.
4. Whatever way these matters will be decided I think it should be carefully
documented so the user have a perfect understanding of possible choices.

 Another approach might be to take advantage of the introduction of 'void'
 content. Since 'void' content would introduce the notion of an empty
 variant, it *might* (see below for my strong reservations) make sense to
 disable the double-storage technique for variants with allowable empty
(i.e.
 void content) states.
 While this is certainly quite implementable, I feel a bit uneasy about
 hinging variant's exception-safety guarantees on such a small point as
 whether 'void' content is allowed. I imagine it would not only make
variant
 more confusing to use but also may not satisfactorily solve the problem of
 delegating the space-vs-safety decision to the user.

I agree on that. I would rather have a variant of variant (;-)) that doesn't
have strong guaranty at all.

Separate issue is the type of which field. Having it as int is an
  This is implementation issue that affect the library design (it affects
  an abstraction overhead). So it's as important as issues above.

 So long as variant::which() returns an int, I don't see how it is anything
 other than a design issue: in terms of space efficiency, the difference
 between sizeof(char) and sizeof(int) is constant.

I do not want to argue on terms. My point is that this implementation detail
make variantint,short size at least 6 instead of 3. 100% difference. So
let's just fix it before release.

Gennadiy.




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


[boost] Re: Variant Library Review

2003-04-01 Thread Gennadiy Rozental
 Hi Gennadiy, thanks for the comments. I apologize for my late response.

Hi Eric,

You got me in process of moving to new apartment, so I was offline for a
while.
I will post my comments in separate threads to simplify tracking.

Gennadiy.



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


[boost] Variant Library: top level const types

2003-04-01 Thread Gennadiy Rozental
  2. Top level const requirement on bounded types.
  It's unreasonable. I should be able to define variant with const
  types. It will be as usable as usual constant types are. The only
  requirements that we may incur is that if one types is const,
  rest should be also.

 It's actually not unreasonable: one of the primary goals of variant is
 to match the semantics of its bounded types as closely as possible. The
 prohibition on top-level const types, then, is quite reasonable.

 To see, consider the following:

   const int i = 3;
   i = 4; // error

   variantconst int v;
   v = 4; // error?

 If top-level const types *were* allowed, then the assignment would
 succeed. Itay and I decided such was highly undesirable. Let me know if
 you disagree with the above reasoning.

If I understood you properly you having problem with the following code
successful compilation:

templatetypename T
struct A
{
char buf[4];

templatetypename Arg
void
operator=( Arg const arg )
{
new (buf) T(arg);
}
};

int main() {
Aconst int a;

a = 4;
}

This wouldn't happened if you use reinterpret cast based implementation, but
probably do not want to rely on it. What I would do is to explicitly
prohibit some operations using static asserts for top level const type
situation. It wouldn't cost you anything and allow to support this usage
case.

Gennadiy.




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


[boost] Variant Library: reflection

2003-04-01 Thread Gennadiy Rozental
  5. Usage std::type_info for reflection
  I don't think we should enforce RTTI for the variant users. We should
  be able to postpone the decision on what kind of reflection
  information user want till instantiation time.

 Please elaborate on this point. FYI, the current variant::type method
 is provided so as to mirror boost::any.

Take a look on recent discussion on lexical type modifications. Here I
express my concern about RTTI affecting the performance of whole
application. Apparently I was not able to find enough confederates to
justify an efforts of making RTTI optional part of interface.
   But still the same applies to Variant library. Presence of typeinfo
header rules out it's usage for me (I will probably need to hack into your
code and eliminate all the references to type_info locally, would I decide
to use it)

Gennadiy.



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


[boost] Variant Library: copy constructible requirements

2003-04-01 Thread Gennadiy Rozental
  3. Copy Constructible/Assignable requirements on bounded types
  This only need to be required if variant should have appropriate
  feature.

 I disagree. As-is, every variant object requires CopyConstructible
 bounded types, as it is the only way to construct its content.

 Some notes, however. I may be able to eliminate the Assignable
 requirement altogether by modifying the implementation of
 variant::swap. As well, there has been some discussion about in-place
 construction, which could eliminate the CopyConstructible requirement
 except in cases of actual variant copying. (This conversation occurred
 with regard to optional, but could work with equal applicability to
 variant.)

 I think it's the way to go. This implementation issue shouldn't affect
overall design. It would be a pity if we couldn't use variant for
noncopyable types.

Gennadiy.



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


[boost] Variant Library: access interface

2003-04-01 Thread Gennadiy Rozental
  Also I think we need free function form of value
  extraction. In other case it would be difficult to place extract
  in context where template parameter is deduced. And check function
  is not that important in most cases.

 While I am again considering a free function, I'm not sure what
 difference it makes. Please elaborate.

templatetypename T
void foo( T const )
{
 
}

int main()
{
boost::variantint,. v = 5;

   // Here I want to pass const reference to integer value of variant to
function foo
  // foo( getint( v ) ); - type T is incorrect
   foo( ??? );
}

 Also, I think the functionality offered in extract::check is quite
 important. Unlike visitation, extract (or get, or whatever) handles
 only one of several possible states of the given variant object.

But you are calling check inside access method and throw an exception in
case of error. It should be enough in most cases IMO. Did I get you wrong.

Gennadiy.




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


[boost] Variant Library: variant size and strong guaranty

2003-04-01 Thread Gennadiy Rozental
  7. Variant size
  Unfortunately I was not able to follow exact logic behind usage of 2
  different storages. But one thing I know:
  sizeof(boost::variantint,std::string) could not be 28.
  From what I view it seems that types that are used to construct
  storage2 also used when constructed storage1. So we definitely have
  size duplication here.

 The two storages implement Anthony William's double storage
 technique. (See
 http://aspn.activestate.com/ASPN/Mail/Message/boost/1314807 for an
 overview.) This technique is necessary to provide a general guarantee
 of strong exception-safety, which in turn is necessary to maintain
 a never empty invariant for variant.

What is this invariant? And why is it that important.

From what I see in above message, Anthony clearly indicate that here we have
a tradeoff between strong guaranty and doubled variant size. Not arguing the
importance of strong guaranty I still believe you are not allowed to make
this important decision for the Variant library users. We either need to
find a different way to implement boost::variant with strong guaranty or
need to provide a way for the user to decide what is more important. BTW why
do you need to carry this second storage all the way through the variant
object lifetime. Why couldn't you use stack allocated buffer in copy/assign
methods?

 In regard to the particularly large size you report, I believe it
 results from a problem either with boost::type_with_alignment itself or
 with my understanding of it. Thus, I am aware of the problem, but I am
 still determining how best to address it.

I think this should be resolved before boost::variant is going in release.

  Separate issue is the type of which field. Having it as int is an
  overkill. It would be enough in majority of the cases have char. But
  we should be able to deduce the correct type depends on number of
  argument types.

 You're probably right: I doubt more than 127 types will ever be needed.
 Still, this is an implementation issue, and variant::which() will
 return int.

This is implementation issue that affect the library design (it affects an
abstraction overhead). So it's as important as issues above.

Gennadiy




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


[boost] Re: patch: BOOST_AUTO_UNIT_TEST in auto_unit_test.hpp

2003-03-25 Thread Gennadiy Rozental
 Hmmm. It works for me. I'm using BOOST_AUTO_UNIT_TEST across several of my
 source files without name collisions (after my patch). I'm also using the
GCC
 #pragma interface feature, which might make a difference. Pardon my
 ignorance, since I'm not very familiar with the auto unit test
implementation.

I couldn't imagine how it may work. Each module will have following:

static boost::unit_test_framework::test_suite* test = BOOST_TEST_SUITE(
Auto Unit Test );

boost::unit_test_framework::test_suite*
init_unit_test_suite( int /* argc */, char* /* argv */ [] ) {
return test;
}

So. You should get symbols conflicts. Even if compiler/linker is able to
somehow choose and bind one of multiple init_unit_test_suite with library
call, it still should only run tests registered in selected module.

I would not play on such shaky grounds.

Gennadiy.




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


[boost] Re: Re: MSVC++ 6.0 compiler errors with 1.30.0 (mostlylexical_cast.hpp)

2003-03-22 Thread Gennadiy Rozental
  There's absolutely no reason I can see to make the exact exception
  type depend on the types concerned.  Just use a straightforward
  class, something along the lines of:
 
   struct bad_lexical_cast : std::exception
   {
  bad_lexical_cast(
 std::type_info const src, std::type_info const dst)
   : m_src(src), m_dst(dst) {}
  char const* what() throw() { return bad_lexical_cast; }
 
  std::type_info const src() const { return m_src; }
  std::type_info const dst() const { return m_dst; }
private:
  std::type_info const src;
  std::type_info const dst;
   };

 Right. I see that Kevlin also suggest this approach in a later posting.
The
 original version of the extended exception used static initialization, as
 mentioned, which is why it was templated.

 I think this is a good approach.

 Regarding the other MSVC 6 warning given in the original report, Gennaro
 Prota has suggested using an explicit !=, rather than relying on the
 implicit conversion from pointer to bool. This also avoids using a cast,
 instead.


 Regards,

 Terje

Sorry to interfere to this fine discussion, but from my standpoint
introduction of std::type_info into lexical_cast is a big problem. I usually
compile my program with noRTTI flag effectively making any program using new
lexical cast fail to link.. Would you want to supply type information you
may do it like this:

struct bad_lexical_cast {
...
virtual char const* src() = 0;
virtual char const* trg() = 0;
};

templatetypename Target, typename Source,typename ReflectionPolicy=
default_reflection
struct no_lexical_conversion : struct bad_lexical_cast
{
virtual char const* src() { return
ReflectionPolicy::type_infoSource() }
virtual char const* trg()  { return
ReflectionPolicy::type_infoTarget() }
}

struct default_reflection {
   templatetypename T
   char const* type_info()
   {
static std::type_info ti = typeid(T);
return ti.name().c_str();
   }
}

Now, question remains how user will customize ReflectionPolicy. I see at
least 2 ways:
1. Add third template parameter to the lexical_cast with default value
2. Use global trait (in this case you may return customizable type from src,
trg functions instead of char const*)

I could not afford to include typeinfo into my source and never do. And I
do not think lexical cast should force me.

Regards,

Gennadiy.




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


[boost] Re: RC_1_30_0 test broken (was RE: Re: RC_1_30_0 still broken--More lexical_cast)

2003-03-19 Thread Gennadiy Rozental

 === //depot/devel/lib/boost/vendor/boost/test/unit_test_suite.hpp#1 -
/home/green/p4/devel/lib/boost/boost/test/unit_test_suite.hpp 
 ***
 *** 267,273 
   if( name_[0] == '' )
   name_.erase( 0, 1 );

 ! return name_.data();
   }

   } // namespace detail
 --- 267,273 
   if( name_[0] == '' )
   name_.erase( 0, 1 );

 ! return name_.c_str();
   }

   } // namespace detail

This fragment of code was fixed in second revision. It's in different file
now and don't use C literals at all.

Gennadiy.




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


[boost] Re: RC_1_30_0: minorpatch:boost/test/detail/wrap_stringstream.hpp

2003-03-18 Thread Gennadiy Rozental
Does standard require/recomend inline in method declaration? I always
thought it ignored

class A
{
 inline void foo();
 
};

inline void
A::foo()
{

}

Gennadiy



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


[boost] Re: typo in libs/test/doc/execution_monitor.htm

2003-03-18 Thread Gennadiy Rozental
Thanx for the patch. I did not forget about it. Applied.

Gennadiy.



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


[boost] Re: Re: RC_1_30_0 still broken -- More lexical_cast

2003-03-18 Thread Gennadiy Rozental
   Notice the weird misspellings in the error messages. :)
 
  What do you mean?

 boolle and intr? :)

 Could this be a problem in the unit test framework?

Could be. What should it be?
I wil try to reproduce this locally after 1.30 is out.

Gennadiy



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


[boost] Re: tracing / logging library

2003-03-18 Thread Gennadiy Rozental
 Just curious if anyone's doing something along these lines.  A quick
 google search on boost turned up only Boost.Test, which (I think?) is
 something quite different.

This topic came up several times during last year. Nobody seems to
have reviewable results. I do have full-featured tracing/logging library
(ideas similar to Boost.Test logging), but unfortunately do not have time
to boostify it. At least for now.

You are welcome to supply one.

Gennadiy.





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


[boost] Re: Doing sets with the MPL

2003-03-14 Thread Gennadiy Rozental

 BOOST_STATIC_ASSERT( is_same list0, result ::value ); // THIS FAILS;

Use

BOOST_STATIC_ASSERT((mpl::equal list0, result ::type::value ));

Gennadiy.



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


[boost] Re: Outstanding patches and fixes

2003-03-12 Thread Gennadiy Rozental
 * [Boost.Test] Request for const fix in unit_test_suite.hpp
   Posted 12 Feb 2003. Did this ever get resolved? Gennadiy?

Fixed in second revision.

Gennadiy.




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


[boost] Re: release procedure typo(?)

2003-03-11 Thread Gennadiy Rozental
  P.S. Could you, please, clarify for me again what is the purpose of this
  tag? How does it related to the fixes I made in trunk after branch is
  created?

 The tag marks the last trunk revision that has been merged into the
 branch, so that when you do a merge to the branch you can always do

 cvs up -jmerged_to_RC_whatever -jHEAD

 Then when you switch back to the trunk (HEAD) you move the
 merged_to_RC_whatever tag to point at the HEAD again.

Imagine I change the file abc.cpp.

1. I commited it im main trank: cvs commit abc.cpp
2. I tag it with merged_to_RC_whatever tag (? this is not in a procedure
right now)
3. I merge it to the release branch

Additionally if I need to change it again, before step 2  Iwill nedd to
untag it: cvs tag -d merged_to_RC_whatever, which is also is not in release
procedure right now.

Did I get it correct?

Gennadiy.




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


[boost] Re: Re: release procedure typo(?)

2003-03-11 Thread Gennadiy Rozental
  1. I committed it in main trunk: cvs commit abc.cpp
  2. I tag it with merged_to_RC_whatever tag (? this is not in a procedure
  right now)
  3. I merge it to the release branch

 No, you got 2 and 3 reversed, and you only do the tagging after
 switching back to the trunk.

I got it now. May be we could spell out explicitly what we are merging into
branch: namely the deference between merged_to_RC_whatever and HEAD tags.
Not all that fluent with cvs flags.

  Additionally if I need to change it again, before step 2  I will need to
  untag it: cvs tag -d merged_to_RC_whatever,

 Absolutely not.

A! I missed -F flag. Maybe we should spell it out explicitly?

Gennadiy.



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


[boost] Re: Re: Re: release procedure typo(?)

2003-03-11 Thread Gennadiy Rozental

 It looks pretty explicit to me.  If you think it can be improved,
 please propose a doc patch.

May be like this. See the patch attached.

Gennadiy.



begin 666 release_procedures.diff
[EMAIL PROTECTED](')E;5AV5?')O8V5D=7)ERYH=T-CT]/3T]/3T]/3T]/3T]
M/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]
M/3T]/3T]/3T-E)#4R!F:6QE.B O8W9SF]O=]B;V]S=]B;V]S=]M;W)E
M+W)E;5AV5?')O8V5D=7)ERYH=[EMAIL PROTECTED]F5TFEE=FEN9R!R979IVEO
M;B Q+C8-[EMAIL PROTECTED]@+7(Q+C8@F5L96%S95]PF]C961UF5S+FAT;0T*
M+2TM(')E;5AV5?')O8V5D=7)ERYH=T),[EMAIL PROTECTED](#(P,#,@,30Z,[EMAIL PROTECTED]
M,S@@+3 P,# ),2XV#0HK*RL@F5L96%S95]PF]C961UF5S+FAT;0DQ,2!-
M87(@,C P,R Q-SHT-3HS-2 M,# P, T*0$ @[EMAIL PROTECTED](LX-RPS,2! 0 T*
M( @( \;D^0V]M;6%N9!,:6YE($-64SH\+VQI/@T*( @/]U;#X-B @
M(#QB;]C:W%U;W1E/@T*+2 @( \')E/EM!9G1EB!F:7AE9!C;V1E(ES
M(-O;6UI='1E9!T;R!M86EN()R86YC:%T-BUC=G,@=7!D871E(UR(%)#
M7S%?,C9?,B!;W=I=-H('1O('1H92!R96QE87-E(-A;F1I9%T92!BF%N
M8VA=#0HM8W9S('5P9%T92 M:CQA(AR968](B-M97)G961?=]?4D-?;E]N
M7VXB/FUEF=E9%]T;U]20U\Q7S(V7S(\+V$^(UJ2$5!1!B=6=G6-O94N
M:'!P(%MM97)G92!C:%N9V5S(9R;[EMAIL PROTECTED]')U;[EMAIL PROTECTED][EMAIL 
PROTECTED])A;F-H70T**R @
M( \=6P^#0HK( @( @/QI/D9I5D(-O94@:7,@8V]M;6ET=5D('1O
M(UA:[EMAIL PROTECTED])A;F-H#0HK( @( @/]L:3X-BL@( @( \;D^4W=I=-H
M('1O('1H92!R96QE87-E(-A;F1I9%T92!B[EMAIL PROTECTED]BL@( @( @( \
M+W!R93YC=G,@=7!D871E(UR(%)#7S%?,C9?,CPO')E/@T**R @( @(#PO
M;D^#0HK( @( @/QI/DUEF=E(-H86YG97,@:[EMAIL PROTECTED]G5N:R!S:6YC
M92!PF5V:6]S(UEF=E('1O()R86YC: T**SQPF4^8W9S('5P9%T92 M
M:CQA(AR968](B-M97)G961?=]?4D-?;E]N7VXB/FUEF=E9%]T;U]20U\Q
M7S(V7S(\+V$^(UJ2$5!1!B=6=G6-O94N:'!P#0H@(TM)F=T.R!20U,@
[EMAIL PROTECTED]W)O;W0O8F]OW0O+BXN+V)U9V=Y8V]D92YH' [EMAIL PROTECTED]( M
M+29G=#L@( @F5TFEE=FEN9R!R979IVEO;B Q+C0-B @+2TF9W0[( @
M(')E=')I979I;F@F5V:7-I;VX@,2XV#0HM(TM)F=T.R @(!-97)G:6YG
M(1I9F9EF5N8V5S()E='=E96X@,2XT(%N9 Q+C8@:6YT;R!B=6=G6-O
M94N:'!P#0HM#0HM8W9S(-O;6UI= M;2 F75O=#M-97)[EMAIL PROTECTED](9O
MB!PF]B;5M('AYB!FF]M('1R=6YK('1O()R86YC:9Q=6]T.R!B=6=G
M6-O94N:'!P#0HM8W9S('5P9%T92 M02!;[EMAIL PROTECTED]:R!T;R!M86EN('1R
M=6YK70T*+6-VR!T86@[EMAIL PROTECTED],@;65R9V5D7W1O7U)#7S%?,CA?,B!B=6=G
M6-O94N:'!P(%MT86@;F5W(UEF=E9!P;VEN=%T-BT-BU;4F5P96%T
M(%S(YE961E9%T\+W!R93X-[EMAIL PROTECTED]( @($UEF=I;F@9EF9F5R
M96YC97,@8F5T=V5E;B [EMAIL PROTECTED](#$N-B!I;G1O()U9V=Y8V]D92YH' \
M+W!R93X-BL@( @( \+VQI/@T**R @( @(#QL:3Y#;VUM:70@;65R9V5D
M()R86YC: T**SQPF4^8W9S(-O;6UI= M;2 F75O=#M-97)[EMAIL PROTECTED]
M(9OB!PF]B;5M('AYB!FF]M('1R=6YK('1O()R86YC:9Q=6]T.R!B
M=6=G6-O94N:'!P/]PF4^#0HK( @( @/]L:3X-BL@( @( \;D^
[EMAIL PROTECTED]:R!T;R!M86EN('1R=6YK#0HK/'!R93YC=G,@=7!D871E(U!/]P
MF4^#0HK( @( @/]L:3X-BL@( @( \;D^36]V92!T86@=[EMAIL PROTECTED]
M97@;65R9V5D('!O:6YT#0HK/'!R93YC=G,@=%G(U(UC(UEF=E9%]T
M;U]20U\Q7S(X7S(@8G5G9WEC;V1E+FAP#PO')E/@T**R @( @(#PO;D^
M#0HK( @( @/QI/E)E5A=!AR!N965D960-BL@( @( \+VQI/@T*
M*R @( \+W5L/@T*( @/]B;]C:W%U;W1E/@T*( @/'5L/@T*( @( \
1;D^5VEN0U93.CPO;D^#0H`
`
end


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


[boost] Re: I/O library formal review

2003-03-11 Thread Gennadiy Rozental
 * The Rationale for Array-Based Streams concludes it may have real-life
 applications. It would be a bit more satisfying if there was at least one
 example of a real-life application.

I second this. Could anybody show an example where array_stream would be
preferable to stringstream.
In other case I do not see a reason to include this component. Maybe only as
an example in .../lib/io/example

  * newl needs a bit more rationale. How is cout  newl different from
cout
  '\n'? How is it better?

Maybe newl does not reset the manipulators? If it true it should be spelled
out explicitly. In any case I also like to see an example where newl is
preferable to  '\n'.

Gennadiy.



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


[boost] release procedure typo(?)

2003-03-10 Thread Gennadiy Rozental
Hi, Beman

In examples for release procedure you are using: merged_to_1_26_2. While
in Release Procedures for the Release Manager section you are mention:
merged_to_RC_n_n_n. What is correct?

Gennadiy.

P.S. Could you, please, clarify for me again what is the purpose of this
tag? How does it related to the fixes I made in trunk after branch is
created?




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


[boost] Re: Compiling boost.test with VC7

2003-03-05 Thread Gennadiy Rozental
You couldn't build dlls out of Boost.Test sources on win32 platform yet. Is
there way to explicetly prohibit build of the target in Jamfile for specific
platform?

Gennadiy.



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


[boost] Variant Library Review

2003-03-03 Thread Gennadiy Rozental
Hi,

  Here is my a bit late review for the variant library. In spite of several
concerns that I have, I incline to vote to ACCEPT this submission.
Design concerns I would like to be discussed and either accepted or
dismissed. Implementation issues are less important. Rest is mostly
comments.
Here follows my detailed review. I was not able to follow closely to the
others review, so it may intersects. Issues listen in no particular order.

Design
_

In most part design of the library looks solid and well thought-out( I think
we definitely ought to give Andrei credits for this also). There are several
things that bother me though.

1. Two types requirement
It's unreasonable. ! or even zero sized variants should be allowed.

2. Top level const requirement on bounded types.
It's unreasonable. I should be able to define variant with const types. It
will be as usable as usual constant types are. The only requirements that we
may incur is that if one types is const, rest should be also.

3. Copy Constructible/Assignable requirements on bounded types
This only need to be required if variant should have appropriate feature.

4. DefaultConstructible requirements on first bounded types
This only need to be required if variant need to be default constructible.

5. Usage std::type_info for reflection
I don't think we should enforce RTTI for the variant users. We should be
able to postpone the decision on what kind of reflection information user
want till instantiation time.

6. extract
I not like this name. It does not reflect the essence of the operation it
performs. It does not extract juice from orange. It provides an access to
the varant value. It basically external access method. So the name get,
get_value would be more appropriate. Also I think we need free function form
of value extraction. In other case it would be difficult to place extract in
context where template parameter is deduced. And check function is not that
important in most cases.

7. Variant size
Unfortunately I was not able to follow exact logic behind usage of 2
different storages. But one thing I know:
sizeof(boost::variantint,std::string) could not be 28.
From what I view it seems that types that are used to construct storage2
also used when constructed storage1. So we definitely have size duplication
here. Separate issue is the type of which field. Having it as int is  an
overkill. It would be enough in majority of the cases have char. But we
should be able to deduce the correct type depends on number of argument
types.

8. Visitation algorithm
In sketch presented visitation algorithm look like this:

void foo1( which, visitor )
{
if( n = 1 )
   visitor(...)
   else
  foo2( which, visitor );
}

void foo2( which, visitor )
{
if( n = 2 )
   visitor(...)
   else
  foo3( which, visitor );
}



In a pseudo code it could be rewritten like this

foo( visitor )
{
   if( which == 1 ) visitor( first field );
   else if( which == 2 ) visitor( second field );

...
   else if( which == n ) visitor( nth field );
}

It's obvious that switch-based algorithm will be more effective. And I
believe that given at compile time number of the types supplied (or maximum
possible types variant accepts we should be able to generate one (even if we
will need to use PP for that )

9. Design of the container move function
I do not see a way how with current design and implementation of the
container move function I could move content of one vector into another
originally empty vector.
move(src.begin(),src.end(),trg.begin() ) will move to garbage memory
move(src.begin(),src.end(), back_inserter( trg ) ) will copy instead of move
Do we need something like back_move_inserter?

Implementation
_
General comment: I believe that all template functions in header files need
to be defined inline.

static_visitor.hpp
Line template typename R = void fails to compile with MSVC6.5. SO to make
it work I was forced to use following form
template typename BOOST_MPL_AUX_VOID_SPEC_PARAM(R)
This and also the fact that MSVC6.5 could not handle return void construct,
forced me to change all the visitors defined in visitor.hpp to return
boost::mpl::void_. Maybe you could find better workaround

static_visitable.hpp
1. I believe that implementation of this concept could be enhanced. The
major problem as I see it is that static_visitable_traits could not be
instantiated with const type. That force you to propagate switch on
const/non const in many different places. While you could do this only once
in static_visitable_traits implementation. See attached file for details.
Once you do this the implementation of unary apply_visitable will became as
simple as this:

template typename Visitor, typename Visitable
typename Visitor::result_type
apply_visitor( Visitor visitor, Visitable visitable )
{
return static_visitable_traitsVisitable
::apply_visitor(visitor, 

[boost] Broken links report

2003-02-26 Thread Gennadiy Rozental
Hi,

I played today with some links validation software and set it upon
www.boost.org

Here the results for those who is interested.

http://groups.yahoo.com/group/boost/files/BrokenLinksReport.htm

I took care about Boost.Test issues.

Gennadiy.



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


[boost] Re: Lock Classes: Does anyone care.

2003-02-19 Thread Gennadiy Rozental
  Mutex locking is a simple example of resource management idiom. All
flavors
  of resource management are easily implemented in terms of policy based
smart
  pointers (don't allow name to confuse you). In this particular case most
  probably all that you need is a custom StoragePolicy. Now you can enjoy
all
  the variety of ownership policies supplied with smart_ptr or design your
own
  for very specific needs.

 To use an old English idiom, I think you are putting the cart before the
 horse [as did Modern C++ Design, IMNSHO]

 Resource protection is a useful concept, and pointers are simply another
 resource that needs protecting.  It makes little sense to dereference a
 mutex, for instance.  This is one of the defining concepts of a pointer.

 Rather, I think if we seek a generic implementation the 'base' concept
 is resource protection, and smart pointers are a refinement of this
 concept.

First of all let me emphasize that it seems that we agree that this kind of
task require some generic component based implementation.
Now about the order. smart_ptr checking policy allows prohibit at compile
time using of operator* or operator-, effectively removing them from public
interface on the resource manager class. On the other hand in some cases we
need to provide an access to managed resource (for example to call methods
of it). Aforementioned operators could be very handy in this case. So I
don't think that smart_ptr interface does not fit for the purpose of generic
resource manager. In any case it's details of implementation, that we may
discuss during pbsp review.

Gennadiy.



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



[boost] Re: Re: Re: Lock Classes: Does anyone care.

2003-02-19 Thread Gennadiy Rozental
 In that fashion it makes sense.  But the only smart_ptr that will make
 any sense is scoped_ptr.  Which will only implement idea #1.  As I said my
 classes offer far more.

Under smart_ptr I meant policy pased smart pointer, that supply a wide
variaty of ownership policies and allow you to write custom one.

Gennadiy.




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



[boost] Re: Lock Classes: Does anyone care.

2003-02-18 Thread Gennadiy Rozental
Two comments:

1. Does not Boost.Thread already have locking mechanisms
2. IMO any locking mechanisms should be implemented in terms of smart_ptr

Gennadiy.



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



[boost] Re: Re: Re: boost.test thread safe bugs (and some fixes)

2003-02-18 Thread Gennadiy Rozental
 If you consider a test suite a test case (which should be how it is, no?),
 then yes, that's all I'd need.

Yes. test suite is a test case.

  1. Boost.Thread with depend on multithreaded version of Boost.Test. 2.
  Boost.Test will try to use minimal/basic part of Boost.Thread
  functionality

 There's no minimal/basic part of Boost.Thread that doesn't need testing.

I did not mean that it does not need testing. What I meant is that I will
try to use only small part of Boost.Thread functionality.
What I propose is that we first check that namely this part is working (It
could be part of Boost.Tet or BoostThread unit test)
And then move on with rest of your testing.

  If I can't rely on it working in my own regression testing, I ceratainly
 can't rely on it being a part of the underlying test framework.  I know
 this means more work for you, but there's not much to be done about it.
 You can sacrifice performance, however, in a testing framework.  So you
 can probably get by with nothing more than a simple mutex and a TSS
 concept with out implicit cleanup, which should be fairly trivial for you
 to implement.

I would really prefer not to reinvent the wheel with portable implementation
of Mutex and TSS.

  3. The first test cases of Boost.Thread unit test will need to check
  that the above basic functionality is working as expected. And only of
  these test cases are passing, continue with rest of testing.

 How do I test the minimal portion if I can't use the testing framework?

There are several choises here. You may need to know know Boost.Test is
using mutex and tss. Or you may rely on  Boost.Test unit tests that I will
implement to validate multithreaded usage. For example, start 2 threads and
throw an exceptions in both of them (making sure that there is no race
conditions). This way  we may check that execution monitor jump buffer is
located in thread specific storage. And so on with every usage of
Boost.Thread. An alternative is to write several simple tests for the part
of Boost.Thread that used by Boost.Test without usaing of Boost.Test. Once
they passed we may be confident with usage of Boost.Test for further
testing.

 Boost.Threads is the only library that needs thread-safe versions of
 Boost.Test *TODAY* (at least that are part of the actual Boost project,
 but Boost.Test is also being used outside of the Boost project, and I
 won't begin to claim that I know they don't need thread-safe versions).
 As for not doing it in a hurry... I understand what you're saying, but
 this sounds like it jeapordizes this and future release schedules.  The
 deadlocks reported in the Boost.Threads tests can't be reproduced by
 myself with any of the compilers I have available on any of the 3 machines
 and 2 OSes I have.  This makes diagnosing problems extremely difficult,
 and if I can't trust that the problems aren't in the testing framework,
 it's even more difficult.

As I sad I will make sure it is resolved till next release. Today is
supposed to be a branch. And discussed changes neither simple nor small.
Meanwhile I take a more detailed look on what modules are affected (You are
welcome to take a look youself, cause I am sure you better familiar with
thread safety issues).

Gennadiy.




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



[boost] Re: Lock Classes: Does anyone care.

2003-02-18 Thread Gennadiy Rozental
  2. IMO any locking mechanisms should be implemented in terms of
smart_ptr

 I don't see the fundamental connection between locking and smart
 pointers.

 In particular, which smart_ptr are we talking about?  shared_ptr [which
 may need locking internally for reference count anyway]
 or shared_ptr?

Mutex locking is a simple example of resource management idiom. All flavors
of resource management are easily implemented in terms of policy based smart
pointers (don't allow name to confuse you). In this particular case most
probably all that you need is a custom StoragePolicy. Now you can enjoy all
the variety of ownership policies supplied with smart_ptr or design your own
for very specific needs.


 Why should locks be dynamic rather than stack allocated at all?  I'd
 have though stack-allocation far more intuitive?

smart_pointer based implementation has nothing to do with dynamic/stack
memory allocation. Of course it will be stack based. Usage will be very
similar to scoped_ptr. But instead of memory it will manage the mutex

 --
 AlisdairM

Gennadiy.



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



[boost] Re: Re: Lock Classes: Does anyone care.

2003-02-18 Thread Gennadiy Rozental
  1. Does not Boost.Thread already have locking mechanisms

 The only thing boost threads offer is #1 on my list, that is The ability
 to acquire a lock and release it when the object goes out of scope
 effectively implemented the Monitor concept.  Implementing this idea is
 rather easy and obvious.  It is the other things my classes offer that
 make it interesting.  The differences should be obvious.

In any case it should be part of Boost.Thread IMO. You may propose your
classes as an extension to existent Boost.Thread functionality.

  2. IMO any locking mechanisms should be implemented in terms of
smart_ptr

 This makes absolutely no sense to me, could you please explain your self.

Look on my other post on the topic

Gennadiy.



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



[boost] Re: boost.test thread safe bugs (and some fixes)

2003-02-17 Thread Gennadiy Rozental
 I will try to address 1(without tss) 2 and 4 today.

I committed execution_monitor.cpp with changes that should address above
issues. We may try now recheck how signal handling behave on OpenBSD

Gennadiy.




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



[boost] Re: Re: Re: Win32 Metrowerks problems [was Re: [test] revision two]

2003-02-17 Thread Gennadiy Rozental
  There still are getenv link errors in prg_exec_fail1 and prg_exec_fail2.

 I think I've got them fixed. Testing now.

And what is the fix?

 prg_exec_fail3.cpp is failing: Assertion(div != 0), line 32.

It what supposed to happend. Important thing is whether the test is aborted
at that moment or Boost.Test notification appear.

 --Beman

Gennadiy.



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



[boost] Re: Re: boost.test thread safe bugs (and some fixes)

2003-02-17 Thread Gennadiy Rozental
  The code never promised to work in multithreaded environment, nor even
  to be thread save. It is in my to-do list. Though recent hands in
  several situations may require address some of these issues sooner.

 What?!?  Where's the big, bold disclaimer about that!

It's in to-do section in front page. Though you right. There should have
been explicit disclaimer about that.

 We have to have all
 of the Boost.Test library thread safe, because the Boost.Thread library
 depends on it.

It you are accessing Boost.Test interfaces only from one thread it may work
even with current implementation.

  No. I don't think it's common situation. You don't usually create and
  run test cases inside the other test case code.

 *I* had considered doing just this, in order to get a tree structure for
 dependent test cases.  Nothing in the documentation seems to indicate this
 is something that's not supported, and I think that would be the wrong
 answer in any event.

I already implemented changes that should allow reentrant usage of execution
monitor. So this is not a problem any more. On the other hand
I was thinking about implementing direct support for test cases dependency
inside the Boost.Test (next release). Would it be enough for you to be able
to specify that one test case should run only if some other one passed?

 To make this thread safe you would need to store the pointer in a
  thread local storage slot, BTW I don't think you can use boost.threads
  for this,
  as
 it will create a dependency quagmire for status/Jamfile :-(
 
  I thought to introduce macro BOOST_MULTITHREADED_UNIT_TEST and guard all
  usage of Boost.Thread with it. It does not create extra dependency and
  should allow to build multithreaded version with bjam subvariant
  feature.

 How would this work for the Boost.Thread library.  Boost.Test must be
 usable by Boost.Thread, and this means it must be thread safe with out
 using Boost.Thread.

1. Boost.Thread with depend on multithreaded version of Boost.Test.
2. Boost.Test will try to use minimal/basic part of Boost.Thread
functionality
3. The first test cases of Boost.Thread unit test will need to check that
the above basic functionality is working as expected. And only of these test
cases are passing, continue with rest of testing.

This is not unique situation. Boost.Test have the similar problems. It's
like in relativistic physics: one could not measure the exact value cause
the measure tools affect the measurement.

 Thread safety issues are very critical, AFAICT.  Boost.Threads depends on
 Boost.Test, and assumes it is thread safe.

I understand, William, your concern. But the Boost.Thread library is the
only library that needs thread-safe version of Boost.Test. Thread safety
will need to be addressed all over the place not only in execution_monitor.
Add here that I am not familiar with your library. As a result I would not
want to do this in a hurry. I promise to take care about it for the next
release. Would it be acceptable for you?

 --
 William E. Kempf

Gennadiy.




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



[boost] Re: Re: Regression progress; Win32

2003-02-16 Thread Gennadiy Rozental

 bjam is reporting:

 don't know how to make result_report_test.pattern
 don't know how to make errors_handling_test.pattern

 So it looks like something is wrong with your Jamfile.

I followed Dave A. recommendation and placed them in input section of run
rule.
The above tests expect them as first command line argument. The files
themself are located in test directory.

 Is bjam running it OK on your machine?

Yes. errors_handling_test fails on some compilers due to difference in
compiler output (I will think how to deal with it in a future)

Gennadiy.



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



[boost] Re: Re: Win32 Metrowerks problems [was Re: [test] revisiontwo]

2003-02-16 Thread Gennadiy Rozental
  However, while the header is there, CW's library doesn't actually
  implement the debugging mechanism that this header describes.  This is
  why you're link does not work -- the code just isn't there.

 So Gennadiy's temporary fix is really the permanent fix.

There still are getenv link errors in prg_exec_fail1 and prg_exec_fail2.

Gennadiy.



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



[boost] Re: Re: Regression progress; Win32

2003-02-16 Thread Gennadiy Rozental
  test_fp_comparisons IS failing on all compilers for now. It shows some
  problems with comparison alsorithm. I will take a closer look after
  release.

 Maybe you could take a quick look sooner? We aren't going to branch for
 release until Monday, and the release won't happen for some time after
 that. The whole point of the schedule is to allow time to fix lately
 discovered problems.

The thing is that I do not know yet what the problem is.
The following should work but it does not:

double tmp = 11; // no rounding error
tmp /= 10; // one rounding error

double fp1 = tmp; // no rounding errors
double fp2 = 11./100; // one rounding error
double tolerance = std::numeric_limitsFPT::epsilon() * (4)/2; // one
rounding error; 4 - total number of rounding errors

BOOST_CHECK_CLOSE( fp1, fp2, tolerance ) should work but it does not

I will need to investigate it with more details.

Gennadiy.



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



[boost] Re: Re: OpenBSD regression, hanging tests!

2003-02-16 Thread Gennadiy Rozental
 Changing line 64 to:

 #elif defined(BOOST_HAS_SIGACTION)  !defined(__OpenBSD__)

 Does make the tests not hang any more.

 Instead it causes them to fail with core dumps, or perhaps that's a
success?

errors_handling_test supposed to cause FPE and crash in case if signal
handling is turned off.
I do not know about thread tests.

The problems with hanging tests may be related to the thread safety issues
discoverred by John. We may try to retry to use signal handling once I
address above issues.

 This includes both the test and thread hangs.

What about random?

Gennadiy.



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



[boost] Re: SCO config

2003-02-16 Thread Gennadiy Rozental
 Someone will need to add an SCO specific platform config - I don't have
the
 access to the platform, nor do I know how to detect it - but if you can
 provide me with the information, or if you just want to go ahead and add
it
 then do so.

I will try to look into this. What is the usual procedure for adding
platform specific config?

Gennadiy.



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



[boost] Re: Re: Re: Regression progress; Win32

2003-02-16 Thread Gennadiy Rozental
  bjam is reporting:
 
  don't know how to make result_report_test.pattern
  don't know how to make errors_handling_test.pattern
 
  So it looks like something is wrong with your Jamfile.
 
  I followed Dave A. recommendation and placed them in input section of
run
  rule.
  The above tests expect them as first command line argument. The files
  themself are located in test directory.

 Did you forget to check them in?

They under cvs for a long time. Note that Linux regression tests works as
expected.

Gennadiy.



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



[boost] Re: Regression progress; Win32

2003-02-15 Thread Gennadiy Rozental
 * test lib has three tests failing all compilers; at least some of these
 passed until recently.

Note that errors_handling_test and results_resport_test failures does not
lead ot any error messages.
So I would recommend to perform clean build of those two.
test_fp_comparisons IS failing on all compilers for now. It shows some
problems with comparison alsorithm. I will take a closer look after release.

I also supposedly fixed several errors/warnings from different win32
compilers i my unit test.

 * test lib is causing new Borland warnings for many other libraries. See
 type_traits/is_pointer_test for example.

fixed.

Gennadiy



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



[boost] Re: OpenBSD regression, hanging tests!

2003-02-15 Thread Gennadiy Rozental
 sigaction is supported by all gcc versions if the platform has it (and BSD
 does).

You right. But, then it looks like it does not work properly, cause
siglongjump causing SIGSEGV.
Maybe we do not want to use sigaction facility with gcc 2.95.3?
Could we change  line 64 in execution_monitor.cpp so signal handling won't
be used. Does it fix hanging tests?

Gennadiy.




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



[boost] Re: Regression progress; Win32

2003-02-15 Thread Gennadiy Rozental
I fixed config/test/Jamfile to use proper names of Boost.Test libraries.
How does this thing work in regression testing?

Gennadiy.



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



[boost] [test] revision two

2003-02-13 Thread Gennadiy Rozental
Hi, everybody

Today I committed second revision to Boost.Test library. I am not planning
any more code changes in this release. If I have time I will try to reflect
changes made in revision one and two in documentation (Release notes with
changes log will be present in any case). Here is approximate list of things
that came with this revision:

* XML log format is introduced
   Now user willing to automate errors processing could get a log in XML
format. Command line switch is introduced that manage log format:
  --log_format=[XML|HRF] will force XML or human readable format
respectively.
* XML report format is introduced
   Now user willing to automate results analysis could get a result report
in XML format. Command line switch is introduced that manage report format:
  --report_format=[XML|HRF] will force XML or human readable format
respectively.
* Command line option --output_format is introduced that both log/report
format simultaneously
* BOOST_CHECK_NO_THROW test tool is introduced
  Name says it all.
* BOOST_BITWISE_CHECK test tool is introduced
  Allows to perform bitwise comparisons of the two arguments provided. Will
report as many errors as many bits mismatch. Mismatch position is reported.
* Documentation default palette changed to white
* Components examples and test documentation page is introduced. Now all
test/examples links lead to this page that has summary information about all
of them, that include expected output, type of test and so on.
* Signal handling selection algorithm fixed.
  It's tentative fix, that will need to be substituted with
BOOST_HAS_SIGACTION checks once they are introduce. Current change allowed
to use signal handling with gcc on win32 also.
* C strings usage in minimized as much as possible.
* class_properties header modified to use Boost.Preprocessor for friends
declaration
* other minor changes and bug fixes

Let me know about any issues.

Regards,

Gennadiy.




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



[boost] Re: [test] revision two

2003-02-13 Thread Gennadiy Rozental
  Hi, everybody
 
  Today I committed second revision to Boost.Test library.

 Wow, is that a good idea one day before we branch for release?

I should have done it week ago, but was really sick. Anyway, It does not
contain anything that should break backward compartibility.

Gennadiy.



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



[boost] Re: Win32 Metrowerks problems [was Re: [test] revision two]

2003-02-13 Thread Gennadiy Rozental
 No, it is some sort of configuration problem.

Look on metrowerks linking errors thread. It about the same issue with
different undefined symbol

There was also compilation error with metrowerks. I fixed it couple hours
ago. Unfortunately I do not have direct access to this compiler so
metrowerks specific errors sometime may creep in waiting for regression test
results (I hope to resolve this soon).

Gennadiy.




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



[boost] Re: Request for Config Macro( was RE: Re: [test] unixidentification )

2003-02-13 Thread Gennadiy Rozental
  So, Let introduce one. I need something for coming release.

 Done: it's called BOOST_HAS_SIGACTION

 John.

Why it doesn't get defined for Visual Age C++ on AIX?

Gennadiy.




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



[boost] Re: Request for const fix in unit_test_suite.hpp

2003-02-12 Thread Gennadiy Rozental
Sure. Fixed.

Gennadiy.




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



[boost] Re: [test] metrowerks linking errors

2003-02-10 Thread Gennadiy Rozental
 If you run bjam with -d2 option, you'll see all the command lines, which
 should be enough to find out which libraries are beeing linked.

It appears that I don't really need -d2 to get a linker line. bjam prints ot
togerther with error anyway:

mwld -search -maxerrors 5 -maxwarnings 20 -export
dllexport -nowraplines -g -subsystem console -o
..\..\..\libs\test\test\bin\prg_exec_fail1.test\cwpro8\debug\runtime-link-d
ynamic\prg_exec_fail1.exe
@..\..\..\libs\test\test\bin\prg_exec_fail1.test\cwpro8\debug\runtime-link-
dynamic\prg_exec_fail1.CMD

..\..\..\libs\test\test\bin\prg_exec_fail1.test\cwpro8\debug\runtime-link-dy
namic\prg_exec_fail1.CMD:

..\..\..\libs\test\test\bin\prg_exec_fail1.test\cwpro8\debug\runtime-link-d
ynamic\prg_exec_fail1.obj
..\..\..\libs\test\build\bin\libboost_prg_exec_monitor.lib\cwpro8\debug\run
time-link-dynamic\libboost_prg_exec_monitor.lib
..\..\..\libs\test\build\bin\libboost_prg_exec_monitor.lib\cwpro8\debug\run
time-link-dynamic\libboost_prg_exec_monitor.lib

Does it help?

Gennadiy.





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



[boost] [test] unix identification

2003-02-09 Thread Gennadiy Rozental
Hi,

Some time ago there was a discussion on how properly identify unix for
selecting proper signal handling algorithm. Here is fragment of John
Maddok's letter:

 ... currently you have:

 // for testing on Win32, GCC thinks it is a unix platform
 // TODO: figure out how to tell it is really unix
 #elif defined(__unix)  !defined(__GNUC__)

 There are several things wrong with this:

 __unix need not be defined on POSIX conforming systems
 __unix may be defined on systems that don't support sigaction etc.
 almost all version of __GNUC__ do have sigaction support including
 cygwin.

 How about:

 #if defined(_POSIX_C_SOURCE)  defined(_POSIX_VERSION) 
 (_POSIX_VERSION = 199506L)  !defined(_WIN32)

 which should be about right if I've understood the standard correctly.

IMO there are several issues with above check. If you would take a look here
http://boost.sourceforge.net/regression-logs/cs-win32-links.html#config_info
%20gcc

you will see that

a. _POSIX_C_SOURCE is not defined
b. _POSIX_VERSION is smaller

Nevertheless, I was able to check that this version of gcc perfectly compile
and work with unix style signal handling.
Accordingly here is the question: how properly identify the unix style
signal handling?

Gennadiy.

P.S. Also let me revisit my other related question: would it be ok on all
compatible platforms to use csignal instead of signal.h?




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



[boost] Re: [test] unix identification

2003-02-09 Thread Gennadiy Rozental
  a. _POSIX_C_SOURCE is not defined

 It's probably being overly picky requiring that one to be defined,
strictly
 speaking you can't use any POSIX API's unless _POSIX_C_SOURCE has been
 defined before the inclusion of any std header - most platforms don't seem
 to care though.

  b. _POSIX_VERSION is smaller

 Particular platforms may have sigaction support even though they only
claim
 conformance to an earlier version of the POSIX standard - cygwin is one -
 check for __CYGWIN__.

So as a result we will get:

#if defined(__CYGWIN__) ||
 defined(_POSIX_VERSION)  (_POSIX_VERSION = 199506L)

Did I get it correct now? But look here what I dig up in status pages (not
all compilers unfortunately provide config_info):

A) gcc 3.1 on MacOS
_POSIX_C_SOURCE is not defined
_POSIX_VERSION=198808L
_POSIX2_VERSION=199212L

B) gcc 3.2 on HPUX
_POSIX_C_SOURCE is not defined
_POSIX_VERSION=199009L
_POSIX2_VERSION=199209L

C) gcc 3.2, gcc 2.95.3, intel 6.0, intel 7.0 kylix on linux
_POSIX_C_SOURCE is defined
_POSIX_VERSION=199506L

_POSIX2_VERSION=199209L

D) gcc 2.95.3, gcc 3.2 on OpenBSD
_POSIX_C_SOURCE is not defined
_POSIX_VERSION=199009L

_POSIX2_VERSION=199212L

Cases A,B and D will be ruled out.

Any suggestions?

Gennadiy.



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



[boost] Re: [test] metrowerks linking errors

2003-02-09 Thread Gennadiy Rozental
 It looks to me like the C library is not getting linked into the
 executable.  There are several possible versions of the C library which
 might meet the need (some of them listed in the error messages).

 Can you list the libraries that are being linked in?  From that I can
 probably make a better suggestion.

No. I have no idea. This is bjam output. More examples you could see on
win32 status page for Boost.Test unit tests. Maybe metrowerks toolset could
answer your question.

 -Howard

Gennadiy.



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



[boost] Re: Boost.Test with templated test cases... or is itbind?(was:Howto make Boost.Test work with function objects?)

2003-02-06 Thread Gennadiy Rozental
 test-add(BOOST_TEST_CASE(::boost::bind(fn, 1)));

 I just tried this and MSVC7 tells me:

 test_charset.cpp(50) : error C2664:
 'boost::unit_test_framework::test_case
 *boost::unit_test_framework::create_test_case(void (__cdecl
 *)(void),std::string)' : cannot convert parameter 1 from
 'boost::_bi::bind_tR,F,L' to 'void (__cdecl *)(void)'
  with
  [
  R=void,
  F=void (__cdecl *)(int),
  L=boost::_bi::list_av_1int::type
  ]
  No user-defined-conversion operator available that can
 perform this conversion, or the operator cannot be called

 Is this a problem with me, my compiler, or something else?

 Markus

Did you include unit_test_suite_ex.hpp? If yes, try to separate fn:
function0void tc = fn

Gennadiy.




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



[boost] Re: Re: Minimal test tool - very minor comments

2003-02-06 Thread Gennadiy Rozental
   1 Need to have language extensions enabled. (for WINNT?)
 
  Do I use any nonstandard language extensions?

 No, but code that gets pulled in (WINNT?)does, so the MS project
Properties
 requires /Za.  This is a minor disadvantage if you like to be 'strict'.

Could you be more specific which header require this option? BTW MSVC65 does
not seems to require it.

   2 Need to have /EHa rather than /EHs for async exceptions. (for
WINNT?)
 
  You need to clarify on that. Why would I want to force async exception
  model?

 I can't imagine, but the MSVC compiler 7.0 reports that /EHa is required
for it
 to compile, and it does. (I suspect it is something like winnt.h that is
pulled
 in?)

MSVC 6.5 does not require async model. Would be strange for 7.0 to require
it.

   4 Warnings level 4 ok, (except get two warnings about test_main's
unused
  args). They are used.

Sorry I misundestood you. You could not declare argments names in test_main
if you are not using them

 Plain black on white please.  Sorry to be so boring.

Use btl-simple.css style instead of btl.css. Both are located in style
subdirectory. You will need to change the header of doc files for that.



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



[boost] Re: Suggestion for new test library test tool

2003-02-06 Thread Gennadiy Rozental
 I would like to suggest the addition of the test tool
 BOOST_CHECK_NO_THROW to the boost test library. It's purpose should be
 obvious from the name and I think it would be quite handy when testing
 construction of objects.

 Markus

Why would you need that? It's already checked automatically. If exception is
thrown, you will get the notificatinon from test monitor.

Gennadiy.



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



[boost] Re: Minimal test tool - very minor comments

2003-02-05 Thread Gennadiy Rozental

Paul A. Bristow [EMAIL PROTECTED] wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
 An absolutely invaluable tool.

 Perhaps worth documenting for MSVC 7.0 (and probably 6.5?)

 1 Need to have language extensions enabled. (for WINNT?)

Do I use any nonstandard language extensions?

 2 Need to have /EHa rather than /EHs for async exceptions. (for WINNT?)

You need to clarify on that. Why would I want to force async exception
model?


 3 std for loop scope is OK.

I did not get this at all. What do you mean?


 4 Warnings level 4 ok, (except get two warnings about test_main's unused
args).

They are used.

 (and there are several spilling misfakes in that section
Did you mean spelling mistakes? Could you send them to me?

 - and why is the document background so gray?)
All pages have the same background. What would you prefer?


 Thanks for your work on this.

You are welcome.

 Paul

Gennadiy.




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



[boost] Re: Complex testing requirements

2003-01-30 Thread Gennadiy Rozental
Do you want this to be implemented as part of Boost.Test or Boost.Build?

 * Test cases/suites need to be defined in a tree hierarchy, where branches
 are never run if the parent test doesn't pass.
This could be done in terms of Boost.Test. Not in a current version though.

 * These test cases may include tests for compilation and/or link
 success/failure.

This is definitely soemwhere in Boost.Build area.

 * By default I would like to build and test the entire tree of test
 cases/suites, obeying the first rule I provided above, but there should be
 a way to build and test a single test case/suite with out regard to the
 parent (i.e. force a build and test of a single suite with out regard to
 any others in the tree).

Running test cases by name will be implemented as soon as CLA framework will
be completed. IOW soon.

Gennadiy.




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



[boost] Re: Boost.Test with templated test cases... or is itbind?(was:Howto make Boost.Test work with function objects?)

2003-01-30 Thread Gennadiy Rozental
   I guess it would help if the syntax for all four possibilities
 (normal function, templated function, normal function object templated
 function object) made it into the Boost.Test documentation.

Syntax is basically the same for all simple (not parameterized tests) cases.
Though I admit that extensions should be documented. Depends on my load in
next couple weeks will try to fix in coming release.

Gennadiy.



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



[boost] Re: SmartPtr (Loki) - auto_ptr/move c'tor issue

2003-01-27 Thread Gennadiy Rozental
Hi,

   I also found it incorrect to keep move semantic in basic template while
was working on my adaptation of SmartPtr. Let's look on auto_ptr for
example. It's basically scoped_ptr with added move semantics. The same need
may arise with almost any SP: one with custom deleted or special checking
policy. So I argue that there always exist valid regular (non movable) SP
that correspond to the movable one I need; and movable is always a
metafunction of non movable one. Lets call this metafunction
make_movable. So IMO what we need is to implement this make_movable
metafunction. It could be either

templatetypename SP
make_movable {
  typedef ... type;
}

or

templatetypename Policy1,typename Policy2,... here we list policies of SP
make_movable {
  typedef ... type;
}

What I am currently have is inheritance. Though I am not sure it's best
solution:

template typename T,
  typename StoragePolicy,


class auto_smart_ptr : public smart_ptrT,StoragePolicy,...
{
public:
// here we implement everything that make it movable
// the rest is inherited from smart_ptr
};

class template smart_ptr does not know anything at all about movable
semantic.

Regards,

Gennadiy.




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



[boost] Re: Re: Preliminary submission: command line config fil e library

2003-01-20 Thread Gennadiy Rozental
 You still need to remember something. For example, your library uses ,
 to separate elements of std::list... parameter. Can I guess that from
the
 options declaration?

It has almost nothing to do with parameter definition. It's details of
argument parsing format. You may though specify it explicitly by naming the
interpreter for your parameter, like this:

cla::named_parameterstd::list.., space_separated_list

 Can I guess what multiplicable is?

I think it's pretty obvious. If not I may change name to more
expressive/clear if you know one.

 With your proposal it would look something like

 parser  named_parameter(output)  short_name(o) 
 value_name(file)  description(where to send output)

 And it should be repeated for each option.

in fact:
parser
 dual_named_parameter( output, o )
 format_descr( file )
 description( where to send output );

In your case:
desc3.add_options()
  (output,o, file, where to send output)

The only differences are is that I explicitly specify what does these
strings mean and I allow different kinds of parameters (positional for
example).

 Does key_lookup_policy support short options? No.
But dual_lookup_policy does. program_options may use this policy. I
personally prefer to use key_lookup_policy with guessing_key_policy. I do
not need to remember 2 independent names and could specify long or short
name.

 Therefore program_options cannot support them either. So, if I want to
handle both command line
 and config file I have to give up something very handy.

That is not correct as it follows from above.



 - Volodya

Gennadiy.




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



[boost] Re: Re: Preliminary submission: command line config fil e library

2003-01-17 Thread Gennadiy Rozental
  my_program ( 0, 1) ( 1, 3) (( 0, 1), 15 ), (( 0,1), (7.8) ) 
  This is input  of 2 points circle and line. Here chain_lookup_policy
could
  be useful.

 What if I want C++ expression specified on the command line? Sure, I don't
 want make C++ parser operate on command line. Rather, I'd write

  my_program f(1, 2) + 10

 I don't need chain_lookup_policy where a couple of quote characters will
do.

IT doesn't matter weather or not you are using quotes. To parse out Point,
Point, Circle, Line out of input above you need chain of responsibilities
logic.

 I really can't comment further without seeing the code.

Ok. I put in vault area some snapshot. I take some not testes functionality
out of there. But you should get the feeling. Unfortunately I will be really
busy till the middle of February. So may not be able to work on this further
meanwhile. It's located here:
http://groups.yahoo.com/group/boost/files/cla_framework.zip

 No. Does yours? Getting really picky, does yours allows to validate XML
 against DTD?

In fact yes. My test configuration file look like this:

input_message \
some XML here \
 \


expected_output after transformation 1 cxvbxbxb
expected_output after transformation 2 df  sdf sdf

Now my test program read test configuration file and feed value of
input_message parameter to the xerces parser.


 - Volodya

Gennadiy.



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



[boost] Re: Re: Preliminary submission: command line config filelibrary

2003-01-15 Thread Gennadiy Rozental

Vladimir Prus [EMAIL PROTECTED] wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
 Gennadiy,

  About month ago, while working on Boost.Test issues I was faced with the
  need for the more or less full featured command line argument parser. I
  recall that you were working on one and took a look on some of your
  preliminary code in vault area.

 What code, specifically? The only think I remember placed there is
 a low-level command line parser, which was never meant to be the
 single solution. In fact, it is now meant only for

 1. I don't want to depend on Boost use cases
 2. Possibly, for adding some very custom hooks.

  And ... was really disappointed. I do not
  believe that any solid design could fit for variety of different
  needs/expectations that exist. One big class with many many
options/styles
  does not look like good design decision. I was not able to look into
deep
  details with your current submission, but from what I view even if it
better
  it still has similar design. While we are at it I could make 2 remarks
about
  your submission: a) None of 5 compiler configurations installed on my XP
  could not compile it.

 :-(
 I've made some corrections recently. Did anything improve?
I've tried version you announced yesteday.


  b) see separate post regarding you config file design
  with is also unsatisfactory IMO.

 I have not seen any separate post. Are you sure you've sent it?

It was too late yestaday for another post. I would not be able to comment
now also. See soon.


 So I made my move and implemented my own solution, that I will be
call:
  CLA framework. It's still missing some bits and pieces, particularly
docs is
  not started yet. But I will present it as an alternative to your
submission.
  (Though I may not be able to work on this within following month due to
  extreme load with other activities). Here is short description of my
design.

 Is it possible to take a look at the code, too?

Ok. I will try to clean up and present some compilable snapshot

 Class cla::parser is core class in a framework. It's definition looks
  like this:
  templatetypename LookupPolicy
  class parser : public LookupPolicy {
...
 OK, disagreement begins. I thought that someone could suggest using
policies.
 But considering it, I came to conlustion that they don't give anything.
 Program options are just (name, value) pairs. If you add a mechanism to
 store them into program variables, you have everything.

There are many diffirent algorithms how you could parse program option
values from input. Name part is optional. Consider positional arguments. Or
I have one policy that I forgot to mention: chain_lookup_policy. It's work
is based on Chain of responcibilities Design pattern. In this case Every
parameter knows how to parse itelf out of input. And this identification may
not be the name at all.

 Further, assume this situation. My program would like to handle options
that
 can be specified at
 1. Command line
 2. Config file (ini)
 3. An XML config file
 4. Windows registry

 Things like validation, and default values really apply to all of them.
 I'd like to declare all options once, and then get them from those
sources.
 In your design, I'd have to declare 4 different parsers, feed them all
with
 options, and the parse all the sources, right?

IMO tis is majoy drowback of your solution - you put too many eggs into the
same busket. Compare number of peeople that need only CLA framework with
number of paople that need  all you mention above. Or even CLA and config
file. Numbers are incomparable. What I would od is to present independent
solution. Plus  some kind of unified interface that works on different level
and allows ot compine different configuration means.

 [...]
  Lookup policy
 Lookup policy is in a sense an algorithm for parsing the arguments
from
  the input provided.

 If it's the parsing algorithm, then why it's called lookup policy?

This algorithm defines how we perform lookup of the parameter in the input.
Do you have better name?

  Each specific lookup policy could incur what type of the
  parameters/modifiers it's supports. Currently framework itself present
  following lookup policies;
 
  key_lookup_policy  - each parameter is identified by unique key
  positional_lookup policy  - each parameter is identified by position in
  input
  dual_lookup_policy - each parameter is identified by dual (most
  probably long/short) key
  getopt_lookup_policy  - getopt style option parsing (with sticky
  options)

  From your description it looks like some of policies deal with parsing
 and some with parameter naming. Or are they responsible for both?

Policy only defines how we perform *lookups* - parameter identfication.
There is separate class (I did not mention) - interpreter - that is
responcible for parsing the parameter value from input after the parameter
was identified. But it's optional - you are not required to used namely this
mena 

[boost] Re: Re: Preliminary submission: command line config file library

2003-01-15 Thread Gennadiy Rozental

 That's a long way of supporting Vladimir's views above. People first need
 just command line arguments, then later realize a config file would be
 nice. And yes, the transition should be simple and transparent.

 --Beman

I do not argue that an ability to support other configuration means could be
convinient *in some cases*. My point is in much more frequently  rigid
coupling of cla and config file support will be undesired burden.
   IMO expressed in other post we need separate components responsible for
every configuration source. Support for simple and transparent transition
could be done on higher level on top of above components.

Gennadiy.




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



[boost] Re: Boost unit test suggestion - checkpoints for exceptions

2003-01-01 Thread Gennadiy Rozental
 There's one thing I'm wondering about. If you get an exception in a test,
it
 won't show which line caused the exception, only that one has happened
 somewhere. In a unit test with 100+ tests, it can be hard to find which
one
 caused the exception, so I started to litter the test code with
 BOOST_CHECKPOINT(), which then shows up at the exception. However, I
 realised that even this was just narrowing down the search, and to
pinpoint
 the error line, one would need one BOOST_CHECKPOINT() for each test line.
So
 why not automate this?

While working on first revision to Boost.Test I thought about very same
issue in regards to fatal/system errors during testing: How to help
programmer to locate where in test case problem occurred? I was about to
implement automatic checkpointing when I realized that in fact it is
already in place in existent implementation: Just set log  level to all
and last pass/fail message will give you all information you need.

So I do not believe any extension is required in this matter.

Regards,

Gennadiy

P.S. I've tried  several times to reply to your private mail. But got
Undeliverable mail... message. Here is the question and reply:

--- Terje Slettebø [EMAIL PROTECTED] wrote:
P.S. I haven't been able to set the reporting level, by setting environment
variables in Windows. Is there some other way to set the reporting level
 for the unit test framework?

--report_level=[confirm,short,detailed,no]
environment variable: BOOST_TEST_REPORT_LEVEL

Be aware that after setting environment variable in windows you may need
to restart GUI, so it will pick up new value.





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



[boost] Re: Boost release compressed by bzip2

2002-12-01 Thread Gennadiy Rozental

Robin.Hu [EMAIL PROTECTED] wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
 Bzip2 is widely spreaded with GNU software. It is available to all *nix
 platforms those are available to me, include linux, *bsd, solaris, etc...

 IMHO, using tar.bz2 instead of tar.gz is a good idea.

Why would not use rar or ace instead of zip then? It already almost as much
spread as zip is. And twice as small.

Gennadiy.

P.S. If we have enough space could we simply publish several additional
formats?




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



[boost] Re: BOOST_CHECK_EQUAL() dangers

2002-12-01 Thread Gennadiy Rozental
 Actually I was hoping you would choose option 3. :-) For me, option 2
 just doesn't feel right. And I think it's not in the spirit of the
 standard, either. (Implicit conversion from char * to string doesn't
 exist, a char * is just a pointer.) I would classify this as
 suprising behaviour which should be avoided wherever possible.

Test library is all about usability and only then generocity or standart
purity. Would you be working with c strings I wonder how long it will take
until you became tired adding std::string on both sides of comparison:

BOOST_CHECK_EQUAL( std::string( s ), std::string( t ) );
...
BOOST_CHECK_EQUAL( std::string( s ), std::string( t ) );
...
BOOST_CHECK_EQUAL( std::string( s ), std::string( t ) );

and will introduce simple forwarding macro

#define M_CHECK_EQUAL_STR( s, t ) \
 BOOST_CHECK_EQUAL( std::string( s ), std::string( t ) );

Boost.Test is doing this for you now. There is a very little posibility of
misuse (comparison of pointers as check for correctness is very strange
things in general IMO).

Gennadiy.





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



[boost] Re: Re: Boost release compressed by bzip2

2002-12-01 Thread Gennadiy Rozental
 Because none of those; bz2, rar, or ace, will let you do this...

 tar zxvf boost-1.29.0.tar.gz

I could not get your point here. Every archiver has it's own command for
unpacking. So what?
Gennadiy.




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



[boost] Re: [Test] Feature request

2002-11-30 Thread Gennadiy Rozental
David B. Held [EMAIL PROTECTED] wrote in message
asb9ml$iqi$[EMAIL PROTECTED]">news:asb9ml$iqi$[EMAIL PROTECTED]...
 When I'm running a test program, it would be nice to get a usage message
 with a -help or -? parameter.  That way, I don't have to remember all the
 log
 level parameters, etc.

 Dave

Ok.

Gennadiy.





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



  1   2   >