Boost
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- 32 participants
- 33325 discussions
Hi,
You've probably seen "modern" languages that incorporate the keyword
finally, but nothing such exists in C++. I've come with a simple
class that could perform close to that keyword. The main exception is
that you have to define what finally does BEFORE the try catch
clause, which is kind of counter-intuitive but not hurtful.
The obvious advantages of such a class over a smart_ptr<X> (X could
be void*) is that you can use Boost.Bind (cf my code sample), and the
order of the instructions in the finally "clause" is predictable
(which is IIRC not guaranteed on destruction of variables).
Obviously, though, one could not throw inside a finally...
Is such a concept existent currently in Boost (or any library)? If
not, would it be useful? I think so, but eh could be wrong :)
Hans Larsen
----------------
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <vector>
class finally {
protected:
struct helper_base_t { virtual ~helper_base_t() {} };
template< class T > struct helper_t : public helper_base_t {
const T& _;
helper_t( const T& t ) : _(t) { }
~helper_t() { _(); }
};
std::vector< helper_base_t* > vec;
public:
finally() {}
~finally() {
for( std::vector<helper_base_t*>::iterator it = vec.begin(); it !=
vec.end(); it++ )
delete (*it);
}
template< class T > void operator()( const T& t ) {
vec.push_back( new helper_t<T>(t) );
}
};
struct func1 {
void operator()() const { std::cout << 1 << std::endl; }
};
void func2( int& x ) {
std::cout << x << std::endl;
x++;
}
void function()
{
using namespace boost;
using boost::lambda::var;
finally f;
int x = 0;
f( func1() ); // Simply print 1
// This way we can pass parameters between calls...
f( bind( func2, ref(x) ) ); // using Boost.Bind, modify x - will
print 0.
f( bind( func2, ref(x) ) ); // using Boost.Bind, modify x - will
print 1
f( var(x) = 5 ); // using Boost.Bind && Boost.Lambda
f( bind( func2, ref(x) ) ); // using Boost.Bind, modify x - will
print 5
try {
throw int(5);
} catch( short x ) {
std::cout << (x+1) << std::endl;
}
}
int main()
{
try {
function();
}
catch( int x )
{
std::cout << x << std::endl;
}
return 0;
}
8
43
Hello, i have lots of code using boost(1.33.1). It is a really great
API. However, now I have to compile my code on a Solaris SPARC. I must
use the Sun Compiler CC: Sun C++ 5.8 Patch 121017-10 2007/02/21.
Using this compiler my code cannot be compiled. So, I've tested one of
the date_time example(Simple Timezone) provided by your website:
http://www.boost.org/doc/html/date_time/examples.html#date_time.examples
.simple_time_zone
I get the following error:
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 189: Error: Could not find a
match for std::has_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::time_duration&).
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 190: Error: Could not find a
match for std::use_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::time_duration&).
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 190: Error: Could not find a
match for std::use_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::time_duration&).
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 50: Error: Could not find a
match for std::has_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::ptime&).
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 51: Error: Could not find a
match for std::use_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::ptime&).
"/export/home/venninj/opt/boost/1.33.1/include/boost-1_33_1/boost/date_t
ime/posix_time/posix_time_io.hpp", line 51: Error: Could not find a
match for std::use_facet<std::Facet>(std::locale) needed in
boost::posix_time::operator<<<char, std::char_traits<char>>(std::ostream
&, const boost::posix_time::ptime&).
Do you know how theses errors can be fixed?
Thank you,
Joel
Ce message et toutes les pieces jointes (ci-apres le "message") sont confidentiels et etablis a l'intention exclusive de ses destinataires.
Toute utilisation ou diffusion non autorisee est interdite.
Tout message electronique est susceptible d'alteration.
Societe Generale Asset Management et ses filiales declinent toute responsabilite au titre de ce message s'il a ete altere, deforme ou falsifie.
Decouvrez l'offre et les services de Societe Generale Asset Management sur le site www.sgam.fr
********
This message and any attachments (the "message") are confidential and intended solely for the addressees.
Any unauthorised use or dissemination is prohibited.
E-mails are susceptible to alteration.
Neither Societe Generale Asset Management nor any of its subsidiaries or affiliates shall be liable for the message if altered, changed or falsified.
Find out more about Societe Generale Asset Management's proposal on www.sgam.com
2
2
Boost Inspection Report
Run Date: 16:06:22 UTC, Thursday 12 April 2007
An inspection program <http://www.boost.org/tools/inspect/index.html>
checks each file in the current Boost CVS for various problems,
generating this as output. Problems detected include tabs in files,
missing copyrights, broken URL's, and similar misdemeanors.
Totals:
11450 files scanned
908 directories scanned (including root)
198 problems reported
Problem counts:
0 files with invalid line endings
0 bookmarks with invalid characters
3 invalid urls
107 broken links
21 unlinked files
22 file/directory names issues
1 files with tabs
9 violations of the Boost min/max guidelines
35 usages of unnamed namespaces in headers (including .ipp files)
Summary:
archive (3)
bind (1)
boost-root (3)
build (1)
date_time (1)
doc (2)
filesystem (37)
graph (2)
iostreams (3)
lambda (3)
math (8)
more (1)
mpl (4)
multi_array (2)
ptr_container (1)
python (10)
regex (1)
regression (32)
serialization (1)
test (81)
type_traits (1)
Details:
*R* invalid (cr only) line-ending
*A* invalid bookmarks, invalid urls, broken links, unlinked files
*N* file/directory names issues
*T* tabs in file
*M* uses of min or max that have not been protected from the min/max macros, or unallowed #undef-s
*U* unnamed namespace in header
|archive|
boost/archive/basic_streambuf_locale_saver.hpp:
*N* name exceeds 31 characters
boost/archive/impl/xml_wiarchive_impl.ipp:
*U* unnamed namespace at line 53
boost/archive/iterators/remove_whitespace.hpp:
*U* unnamed namespace at line 57
|bind|
boost/bind/placeholders.hpp:
*U* unnamed namespace at line 25
|boost-root|
index.htm:
*A* broken link: doc/hmtl/date_time.html
*A* broken link: doc/hmtl/date_time/details.html#changes
*A* broken link: more/BoostCon07.html
|build|
tools/build/v2/test/test_system.html:
*A* unlinked file
|date_time|
libs/date_time/xmldoc/date_time_docs_howto.html:
*A* unlinked file
|doc|
doc/html/boost_math/inverse_complex.html:
*A* unlinked file
doc/html/jam.html:
*A* unlinked file
|filesystem|
libs/filesystem/doc/do-list.htm:
*A* invalid URL (hardwired file): file://?/
*A* invalid URL (hardwired file): file://?/UNC/
libs/filesystem/doc/i18n.html:
*A* broken link: convenience.htm#basic_recursive_directory_iterator
*A* broken link: exception.htm
*A* broken link: operations.htm
*A* broken link: operations.htm#Do-the-right-thing
*A* broken link: operations.htm#is_directory
*A* broken link: operations.htm#is_file
*A* broken link: operations.htm#status
libs/filesystem/doc/index.htm:
*A* broken link: ../build/Jamfile
*A* broken link: convenience.htm
*A* broken link: fstream.htm
*A* broken link: operations.htm#create_directory
*A* broken link: operations.htm#create_hard_link
*A* broken link: operations.htm#current_path
*A* broken link: operations.htm#directory_iterator
*A* broken link: operations.htm#equivalent
*A* broken link: operations.htm#file_size
*A* broken link: operations.htm#initial_path
*A* broken link: operations.htm#is_file
*A* broken link: operations.htm#is_symlink
*A* broken link: operations.htm#status
*A* broken link: operations.htm#symlink_status
*A* broken link: path.htm#Canonical
*A* broken link: path.htm#Grammar
*A* broken link: path.htm#Normalized
*A* broken link: path.htm#default_name_check
*A* broken link: path.htm#name_check_mechanism
*A* broken link: path.htm#normalize
*A* broken link: path.htm#operator_eq
*A* broken link: path.htm#synopsis
libs/filesystem/doc/portability_guide.htm:
*A* broken link: path.htm#name_check_typedef
libs/filesystem/doc/tr2_proposal.html:
*A* invalid URL (hardwired file): file:///C|/boost/site/libs/filesystem/doc/operations.htm#complete_note
|graph|
libs/graph/example/file_dependencies.cpp:
*M* violation of Boost min/max guidelines on line 139
libs/graph/test/serialize.cpp:
*T*
|iostreams|
libs/iostreams/doc/acknowledgments.html:
*A* unlinked file
libs/iostreams/doc/concepts/multi-character.html:
*A* unlinked file
libs/iostreams/doc/installation.html:
*A* broken link: ../../../tools/build/v1/build_system.htm
|lambda|
boost/lambda/core.hpp:
*U* unnamed namespace at line 62
boost/lambda/detail/lambda_functors.hpp:
*U* unnamed namespace at line 25
boost/lambda/exceptions.hpp:
*U* unnamed namespace at line 24
|math|
libs/math/test/common_factor_test.cpp:
*M* violation of Boost min/max guidelines on line 146
*M* violation of Boost min/max guidelines on line 147
*M* violation of Boost min/max guidelines on line 193
*M* violation of Boost min/max guidelines on line 194
|more|
more/separate_compilation.html:
*A* broken link: ../libs/config/test/link/test/Jamfile.v2
|mpl|
boost/mpl/alias.hpp:
*U* unnamed namespace at line 17
libs/mpl/doc/refmanual/for-each.html:
*A* broken link: ./value-initialized.html
|multi_array|
boost/multi_array/base.hpp:
*U* unnamed namespace at line 69
libs/multi_array/test/generative_tests.hpp:
*U* unnamed namespace at line 57
|ptr_container|
libs/ptr_container/doc/tutorial_example.html:
*A* unlinked file
|python|
libs/python/doc/building.html:
*A* broken link: ../../../tools/build/v1/build_system.htm
*A* broken link: ../../../tools/build/v1/build_system.htm#user_globals
*A* broken link: ../../../tools/build/v1/build_system.htm#variants
libs/python/doc/tutorial/doc/html/python/hello.html:
*A* broken link: ../../../../../example/tutorial/Jamrules
libs/python/doc/tutorial/index.html:
*A* broken link: ../../../LICENSE_1_0.txt
libs/python/doc/v2/May2002.html:
*A* broken link: ../../../../tools/build/v1/build_system.htm
*A* broken link: ../../../../tools/build/v1/gen_aix_import_file.py
libs/python/doc/v2/faq.html:
*A* broken link: ../../../../tools/build/v1/build_system.htm
|regex|
libs/regex/performance/input.html:
*A* unlinked file
|regression|
regression/.htaccess:
*N* leading character of ".htaccess" is not alphabetic
tools/regression/test/test-cases/incremental/bjam.log.1:
*N* name contains more than one dot character ('.')
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/compile-fail.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/completed.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/compile-fail.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/completed.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/lib.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/misfire.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/no-run.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/run_pyd.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/test-case.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/test-case.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/test-driver.xsl:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_re_match/expected/test_re_match.xml:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
tools/regression/xsl_reports/test/test-components/test_test_case_status/explicit-failures-markup.xml.test:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
*N* name contains more than one dot character ('.')
*N* name exceeds 31 characters
tools/regression/xsl_reports/test/test-components/test_test_structure/explicit-failures-markup.xml.test:
*N* file path will exceed 100 characters in a directory tree with a root of the form boost_X_XX_X/
*N* name contains more than one dot character ('.')
*N* name exceeds 31 characters
tools/regression/xsl_reports/xsl/html/issues_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/html/library_developer_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/html/library_user_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/html/make_tinyurl.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/html/summary_developer_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/html/summary_user_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/issues_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/library_developer_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/library_user_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/make_tinyurl.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/summary_developer_legend.html:
*A* unlinked file
tools/regression/xsl_reports/xsl/v2/html/summary_user_legend.html:
*A* unlinked file
|serialization|
libs/serialization/src/basic_xml_grammar.ipp:
*U* unnamed namespace at line 43
|test|
boost/test/floating_point_comparison.hpp:
*U* unnamed namespace at line 206
*U* unnamed namespace at line 228
boost/test/impl/cpp_main.ipp:
*U* unnamed namespace at line 42
boost/test/impl/exception_safety.ipp:
*U* unnamed namespace at line 400
boost/test/impl/framework.ipp:
*U* unnamed namespace at line 199
boost/test/impl/plain_report_formatter.ipp:
*U* unnamed namespace at line 45
boost/test/impl/progress_monitor.ipp:
*U* unnamed namespace at line 38
boost/test/impl/results_collector.ipp:
*U* unnamed namespace at line 106
boost/test/impl/results_reporter.ipp:
*U* unnamed namespace at line 48
boost/test/impl/unit_test_log.ipp:
*U* unnamed namespace at line 79
boost/test/impl/unit_test_monitor.ipp:
*U* unnamed namespace at line 35
boost/test/impl/unit_test_parameters.ipp:
*U* unnamed namespace at line 50
boost/test/results_collector.hpp:
*U* unnamed namespace at line 40
boost/test/test_tools.hpp:
*U* unnamed namespace at line 262
boost/test/utils/iterator/token_iterator.hpp:
*U* unnamed namespace at line 166
boost/test/utils/named_params.hpp:
*U* unnamed namespace at line 216
boost/test/utils/runtime/cla/dual_name_parameter.ipp:
*U* unnamed namespace at line 43
boost/test/utils/runtime/cla/modifier.hpp:
*U* unnamed namespace at line 34
boost/test/utils/runtime/env/modifier.hpp:
*U* unnamed namespace at line 34
boost/test/utils/runtime/file/config_file.hpp:
*U* unnamed namespace at line 169
*U* unnamed namespace at line 64
*U* unnamed namespace at line 74
boost/test/utils/runtime/file/config_file_iterator.hpp:
*U* unnamed namespace at line 68
boost/test/utils/trivial_singleton.hpp:
*U* unnamed namespace at line 52
*U* unnamed namespace at line 61
libs/test/build/msvc71_proj/config_file_iterator_test.vcproj:
*N* name exceeds 31 characters
libs/test/doc/components/prg_exec_monitor/compilation.html:
*A* broken link: ../../../build/Jamfile
libs/test/doc/components/prg_exec_monitor/index.html:
*A* broken link: ../../../../../boost/test/cpp_main.hpp
libs/test/doc/components/test_tools/index.html:
*A* broken link: ../../tests/boost_check_equal_str.html
libs/test/doc/components/test_tools/reference/BOOST_CHECK_CLOSE.html:
*A* broken link: BOOST_CHECK_CLOSE_FRACTION.html
libs/test/doc/components/test_tools/reference/BOOST_CHECK_MESSAGE.html:
*A* broken link: BOOST_MESSAGE.html
libs/test/doc/components/test_tools/reference/BOOST_CHECK_SMALL.html:
*A* broken link: BOOST_CHECK_CLOSE_FRACTION.html
libs/test/doc/components/test_tools/reference/tools_list.html:
*A* broken link: ../../btl1.gif
*A* broken link: BOOST_CHECK_CLOSE_FRACTION.html
libs/test/doc/components/utf/compilation.html:
*A* broken link: ../../../build/Jamfile
libs/test/doc/components/utf/components/index.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/components/test_case/abstract_interface.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/auto_register_facility.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/boost_function_tc.html:
*A* broken link: ../../../../../../../boost/test/unit_test_suite_ex.hpp
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/class_tc.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/function_tc.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/index.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/param_boost_function_tc.html:
*A* broken link: ../../../../../../../boost/test/unit_test_suite_ex.hpp
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/param_class_tc.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/param_function_tc.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_case/tc_template.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_log/custom_log_formatter.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_log/index.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_result/index.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/components/test_suite/index.html:
*A* broken link: ../../../btl1.gif
libs/test/doc/components/utf/index.html:
*A* broken link: getting_started/index.html
libs/test/doc/components/utf/parameters/build_info.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/catch_system_errors.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/detect_memory_leaks.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/index.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/log_format.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/log_level.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/no_result_code.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/output_format.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/random.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/report_format.html:
*A* broken link: ../../../../../LICENSE_1_0.txt
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/report_level.html:
*A* broken link: ../../btl1.gif
libs/test/doc/components/utf/parameters/show_progress.html:
*A* broken link: ../../btl1.gif
libs/test/doc/examples/unit_test_example1.html:
*A* broken link: ../../example/unit_test_example1.cpp
libs/test/doc/examples/unit_test_example2.html:
*A* broken link: ../../example/unit_test_example2.cpp
libs/test/doc/examples/unit_test_example3.html:
*A* broken link: ../../example/unit_test_example3.cpp
libs/test/doc/examples/unit_test_example4.html:
*A* broken link: ../../example/unit_test_example4.cpp
libs/test/doc/examples/unit_test_example5.html:
*A* broken link: ../../example/unit_test_example5.cpp
*A* broken link: ../../example/unit_test_example5.input
libs/test/doc/tests/auto_unit_test_test.html:
*A* broken link: ../../test/auto_unit_test_test.cpp
libs/test/doc/tests/auto_unit_test_test_mult.html:
*A* broken link: ../../test/auto_unit_test_test_mult1.cpp
*A* broken link: ../../test/auto_unit_test_test_mult2.cpp
libs/test/doc/tests/unit_test_suite_ex_test.html:
*A* broken link: ../../test/unit_test_suite_ex_test.cpp
libs/test/doc/tutorials/hello_the_testing_world.html:
*A* broken link: ../../../../../LICENSE_1_0.txt
*A* broken link: ../execution_monitor/index.html
libs/test/doc/tutorials/new_year_resolution.html:
*A* broken link: ../../../../../../LICENSE_1_0.txt
|type_traits|
libs/type_traits/cxx_type_traits.htm:
*A* unlinked file
1
0
Boost Inspection Report
Run Date: 16:06:29 UTC, Thursday 12 April 2007
An inspection program <http://www.boost.org/tools/inspect/index.html>
checks each file in the current Boost CVS for various problems,
generating this as output. Problems detected include tabs in files,
missing copyrights, broken URL's, and similar misdemeanors.
Totals:
11450 files scanned
908 directories scanned (including root)
1051 problems reported
Problem counts:
653 files missing Boost license info or having wrong reference text
398 files missing copyright notice
Summary:
any (1)
archive (1)
build (68)
concept_check (22)
conversion (5)
doc (1)
filesystem (2)
function (1)
graph (1)
inspect (1)
integer (9)
lambda (10)
libs (6)
logic (2)
math (1)
more (13)
mpl (417)
multi_array (13)
numeric (188)
optional (1)
people (4)
program_options (35)
property_map (15)
ptr_container (8)
python (6)
rational (5)
regex (4)
regression (118)
release (2)
serialization (16)
signals (2)
smart_ptr (8)
test (3)
timer (1)
tr1 (2)
tuple (5)
utility (12)
variant (42)
Details:
*L* missing Boost license info, or wrong reference text
*C* missing copyright notice
|any|
libs/any/doc/
any.xml: *L*
|archive|
boost/archive/detail/
utf8_codecvt_facet.hpp: *L*
|build|
tools/build/v2/build/
build-request.jam: *L*
modifiers.jam: *L*
tools/build/v2/doc/
Jamfile.v2: *C* *L*
tools/build/v2/doc/src/
advanced.xml: *C* *L*
architecture.xml: *C* *L*
catalog.xml: *C* *L*
extending.xml: *C* *L*
faq.xml: *C* *L*
fragments.xml: *C* *L*
howto.xml: *C* *L*
install.xml: *C* *L*
recipes.xml: *C* *L*
reference.xml: *C* *L*
standalone.xml: *C* *L*
tutorial.xml: *C* *L*
userman.xml: *C* *L*
tools/build/v2/example/generate/
REAME.txt: *C* *L*
a.cpp: *C* *L*
tools/build/v2/example/generator/
README.txt: *C* *L*
soap.jam: *C* *L*
tools/build/v2/example/python_modules/
python_helpers.jam: *C* *L*
python_helpers.py: *C* *L*
tools/build/v2/test/
abs_workdir.py: *C* *L*
dependency_property.py: *L*
dependency_test.py: *C* *L*
direct_request_test.py: *C* *L*
dll_path.py: *L*
double_loading.py: *L*
duplicate.py: *L*
echo_args.jam: *C* *L*
empty.jam: *C* *L*
expansion.py: *L*
explicit.py: *L*
gcc_runtime.py: *L*
tools/build/v2/test/project-test3/lib3/
Jamfile: *C* *L*
tools/build/v2/test/
readme.txt: *C* *L*
svn_tree.py: *L*
tag.py: *L*
test_system.html: *L*
tools/build/v2/tools/
sun.jam: *L*
xsltproc.jam: *L*
|concept_check|
libs/concept_check/
bibliography.htm: *L*
concept_check.htm: *L*
concept_covering.htm: *L*
creating_concepts.htm: *L*
libs/concept_check/doc/
Jamfile.v2: *C* *L*
libs/concept_check/doc/reference/
Assignable.xml: *L*
BidirectionalIterator.xml: *L*
CopyConstructible.xml: *L*
DefaultConstructible.xml: *L*
EqualityComparable.xml: *L*
ForwardIterator.xml: *L*
InputIterator.xml: *L*
LessThanComparable.xml: *L*
OutputIterator.xml: *L*
RandomAccessIterator.xml: *L*
SignedInteger.xml: *L*
concepts.xml: *L*
libs/concept_check/
implementation.htm: *L*
prog_with_concepts.htm: *L*
reference.htm: *L*
using_concept_check.htm: *L*
|conversion|
libs/conversion/
cast.htm: *L*
index.html: *C* *L*
lexical_cast.htm: *L*
libs/conversion/test/
Jamfile.v2: *L*
|doc|
doc/html/
docutils.css: *L*
|filesystem|
libs/filesystem/doc/
tr2_proposal.html: *L*
libs/filesystem/src/
utf8_codecvt_facet.hpp: *L*
|function|
boost/function/detail/
gen_maybe_include.pl: *L*
|graph|
libs/graph/doc/
lengauer_tarjan_dominator.htm: *L*
|inspect|
tools/inspect/build/
Jamfile.v2: *L*
|integer|
libs/integer/
cstdint.htm: *C* *L*
libs/integer/doc/
integer_mask.html: *L*
static_min_max.html: *L*
libs/integer/
index.html: *C* *L*
integer.htm: *L*
integer_traits.html: *C* *L*
|lambda|
libs/lambda/doc/
Jamfile.v2: *C* *L*
libs/lambda/doc/detail/
README: *C* *L*
lambda_doc.xsl: *C* *L*
lambda_doc_chunks.xsl: *C* *L*
libs/lambda/test/
Makefile: *C* *L*
|libs|
libs/
expected_results.xml: *C* *L*
maintainers.txt: *C* *L*
platform_maintainers.txt: *C* *L*
|logic|
libs/logic/doc/
Jamfile.v2: *C* *L*
|math|
boost/math/
common_factor_rt.hpp: *L*
|more|
more/
error_handling.html: *L*
generic_exception_safety.html: *C* *L*
generic_programming.html: *L*
getting_started.rst: *C* *L*
moderators.html: *C*
regression.html: *C* *L*
report-apr-2006.html: *C* *L*
report-jan-2006.html: *C* *L*
|mpl|
libs/mpl/doc/src/refmanual/
ASSERT.rst: *C* *L*
ASSERT_MSG.rst: *C* *L*
ASSERT_NOT.rst: *C* *L*
ASSERT_RELATION.rst: *C* *L*
AUX_LAMBDA_SUPPORT.rst: *C* *L*
Acknowledgements.rst: *C* *L*
Algorithms-Iteration.rst: *C* *L*
Algorithms-Querying.rst: *C* *L*
Algorithms-Runtime.rst: *C* *L*
Algorithms-Transformation.rst: *C* *L*
Algorithms.rst: *C* *L*
AssociativeSequence.rst: *C* *L*
BackExtensibleSequence.rst: *C* *L*
BidirectionalIterator.rst: *C* *L*
BidirectionalSequence.rst: *C* *L*
CFG_NO_HAS_XXX.rst: *C* *L*
CFG_NO_PREPROCESSED.rst: *C* *L*
Categorized.rst: *C* *L*
Data.rst: *C* *L*
ExtensibleAssociativeSeq.rst: *C* *L*
ExtensibleSequence.rst: *C* *L*
ForwardIterator.rst: *C* *L*
ForwardSequence.rst: *C* *L*
FrontExtensibleSequence.rst: *C* *L*
HAS_XXX_TRAIT_DEF.rst: *C* *L*
HAS_XXX_TRAIT_NAMED_DEF.rst: *C* *L*
Inserter.rst: *C* *L*
IntegralConstant.rst: *C* *L*
IntegralSequenceWrapper.rst: *C* *L*
Iterators-Concepts.rst: *C* *L*
Iterators-Metafunctions.rst: *C* *L*
Iterators.rst: *C* *L*
LIMIT_LIST_SIZE.rst: *C* *L*
LIMIT_MAP_SIZE.rst: *C* *L*
LIMIT_METAFUNCTION_ARITY.rst: *C* *L*
LIMIT_SET_SIZE.rst: *C* *L*
LIMIT_UNROLLING.rst: *C* *L*
LIMIT_VECTOR_SIZE.rst: *C* *L*
LambdaExpression.rst: *C* *L*
Macros-Asserts.rst: *C* *L*
Macros-Configuration.rst: *C* *L*
Macros.rst: *C* *L*
Metafunction.rst: *C* *L*
MetafunctionClass.rst: *C* *L*
Metafunctions-Arithmetic.rst: *C* *L*
Metafunctions-Bitwise.rst: *C* *L*
Metafunctions-Comparisons.rst: *C* *L*
Metafunctions-Composition.rst: *C* *L*
Metafunctions-Conditional.rst: *C* *L*
Metafunctions-Invocation.rst: *C* *L*
Metafunctions-Logical.rst: *C* *L*
Metafunctions-Trivial.rst: *C* *L*
Metafunctions-Type.rst: *C* *L*
Metafunctions.rst: *C* *L*
NumericMetafunction.rst: *C* *L*
PlaceholderExpression.rst: *C* *L*
Placeholders.rst: *C* *L*
RandomAccessIterator.rst: *C* *L*
RandomAccessSequence.rst: *C* *L*
ReversibleAlgorithm.rst: *C* *L*
Sequences-Classes.rst: *C* *L*
Sequences-Concepts.rst: *C* *L*
Sequences-Intrinsic.rst: *C* *L*
Sequences-Views.rst: *C* *L*
Sequences.rst: *C* *L*
TagDispatchedMetafunction.rst: *C* *L*
TrivialMetafunction.rst: *C* *L*
VariadicSequence.rst: *C* *L*
accumulate.rst: *C* *L*
advance.rst: *C* *L*
always.rst: *C* *L*
and_.rst: *C* *L*
apply.rst: *C* *L*
apply_wrap.rst: *C* *L*
arg.rst: *C* *L*
at.rst: *C* *L*
at_c.rst: *C* *L*
back.rst: *C* *L*
back_inserter.rst: *C* *L*
begin.rst: *C* *L*
bind.rst: *C* *L*
bitand_.rst: *C* *L*
bitor_.rst: *C* *L*
bitxor_.rst: *C* *L*
bool_.rst: *C* *L*
clear.rst: *C* *L*
contains.rst: *C* *L*
copy.rst: *C* *L*
copy_if.rst: *C* *L*
count.rst: *C* *L*
count_if.rst: *C* *L*
deque.rst: *C* *L*
deref.rst: *C* *L*
distance.rst: *C* *L*
divides.rst: *C* *L*
empty.rst: *C* *L*
empty_base.rst: *C* *L*
empty_sequence.rst: *C* *L*
end.rst: *C* *L*
equal.rst: *C* *L*
equal_to.rst: *C* *L*
erase.rst: *C* *L*
erase_key.rst: *C* *L*
eval_if.rst: *C* *L*
eval_if_c.rst: *C* *L*
filter_view.rst: *C* *L*
find.rst: *C* *L*
find_if.rst: *C* *L*
fold.rst: *C* *L*
for_each.rst: *C* *L*
front.rst: *C* *L*
front_inserter.rst: *C* *L*
greater.rst: *C* *L*
greater_equal.rst: *C* *L*
has_key.rst: *C* *L*
identity.rst: *C* *L*
if_.rst: *C* *L*
if_c.rst: *C* *L*
inherit.rst: *C* *L*
inherit_linearly.rst: *C* *L*
insert.rst: *C* *L*
insert_range.rst: *C* *L*
inserter_.rst: *C* *L*
int_.rst: *C* *L*
integral_c.rst: *C* *L*
is_sequence.rst: *C* *L*
iter_fold.rst: *C* *L*
iter_fold_if.rst: *C* *L*
iterator_category.rst: *C* *L*
iterator_range.rst: *C* *L*
joint_view.rst: *C* *L*
key_type.rst: *C* *L*
lambda.rst: *C* *L*
less.rst: *C* *L*
less_equal.rst: *C* *L*
list.rst: *C* *L*
list_c.rst: *C* *L*
long_.rst: *C* *L*
lower_bound.rst: *C* *L*
map.rst: *C* *L*
max.rst: *C* *L*
max_element.rst: *C* *L*
min.rst: *C* *L*
min_element.rst: *C* *L*
minus.rst: *C* *L*
modulus.rst: *C* *L*
multiplies.rst: *C* *L*
negate.rst: *C* *L*
next.rst: *C* *L*
not_.rst: *C* *L*
not_equal_to.rst: *C* *L*
numeric_cast.rst: *C* *L*
or_.rst: *C* *L*
order.rst: *C* *L*
pair.rst: *C* *L*
partition.rst: *C* *L*
plus.rst: *C* *L*
pop_back.rst: *C* *L*
pop_front.rst: *C* *L*
preface.rst: *C* *L*
prior.rst: *C* *L*
protect.rst: *C* *L*
push_back.rst: *C* *L*
push_front.rst: *C* *L*
quote.rst: *C* *L*
range_c.rst: *C* *L*
remove.rst: *C* *L*
remove_if.rst: *C* *L*
replace.rst: *C* *L*
replace_if.rst: *C* *L*
reverse.rst: *C* *L*
reverse_copy.rst: *C* *L*
reverse_copy_if.rst: *C* *L*
reverse_fold.rst: *C* *L*
reverse_iter_fold.rst: *C* *L*
reverse_partition.rst: *C* *L*
reverse_remove.rst: *C* *L*
reverse_remove_if.rst: *C* *L*
reverse_replace.rst: *C* *L*
reverse_replace_if.rst: *C* *L*
reverse_stable_partition.rst: *C* *L*
reverse_transform.rst: *C* *L*
reverse_unique.rst: *C* *L*
sequence_tag.rst: *C* *L*
set.rst: *C* *L*
set_c.rst: *C* *L*
shift_left.rst: *C* *L*
shift_right.rst: *C* *L*
single_view.rst: *C* *L*
size.rst: *C* *L*
size_t.rst: *C* *L*
sizeof_.rst: *C* *L*
sort.rst: *C* *L*
stable_partition.rst: *C* *L*
terminology.rst: *C* *L*
times.rst: *C* *L*
transform.rst: *C* *L*
transform_view.rst: *C* *L*
unique.rst: *C* *L*
unpack_args.rst: *C* *L*
upper_bound.rst: *C* *L*
value_type.rst: *C* *L*
vector.rst: *C* *L*
vector_c.rst: *C* *L*
void_.rst: *C* *L*
zip_view.rst: *C* *L*
libs/mpl/doc/
style.css: *L*
libs/mpl/example/fsm/
README.txt: *C* *L*
libs/mpl/test/
Jamfile.v2: *C* *L*
|multi_array|
libs/multi_array/doc/
iterator_categories.html: *C* *L*
reference.html: *L*
libs/multi_array/doc/xml/
MultiArray.xml: *C* *L*
const_multi_array_ref.xml: *C* *L*
multi_array.xml: *C* *L*
multi_array_ref.xml: *C* *L*
reference.xml: *L*
libs/multi_array/test/
Jamfile.v2: *L*
|numeric|
boost/numeric/ublas/
banded.hpp: *L*
blas.hpp: *L*
boost/numeric/ublas/detail/
concepts.hpp: *L*
config.hpp: *L*
definitions.hpp: *L*
documentation.hpp: *L*
duff.hpp: *L*
iterator.hpp: *L*
matrix_assign.hpp: *L*
raw.hpp: *L*
temporary.hpp: *L*
vector_assign.hpp: *L*
boost/numeric/ublas/
exception.hpp: *L*
expression_types.hpp: *L*
functional.hpp: *L*
fwd.hpp: *L*
hermitian.hpp: *L*
io.hpp: *L*
lu.hpp: *L*
matrix.hpp: *L*
matrix_expression.hpp: *L*
matrix_proxy.hpp: *L*
matrix_sparse.hpp: *L*
operation.hpp: *L*
operation_blocked.hpp: *L*
operation_sparse.hpp: *L*
storage.hpp: *L*
storage_sparse.hpp: *L*
symmetric.hpp: *L*
traits.hpp: *L*
triangular.hpp: *L*
vector.hpp: *L*
vector_expression.hpp: *L*
vector_of_vector.hpp: *L*
vector_proxy.hpp: *L*
vector_sparse.hpp: *L*
libs/numeric/conversion/test/
Jamfile.v2: *C* *L*
test_helpers.cpp: *C*
test_helpers2.cpp: *C*
test_helpers3.cpp: *C*
traits_test.cpp: *C*
udt_example_0.cpp: *C*
udt_support_test.cpp: *C*
libs/numeric/ublas/bench1/
bench1.cpp: *L*
bench1.hpp: *L*
bench11.cpp: *L*
bench12.cpp: *L*
bench13.cpp: *L*
libs/numeric/ublas/bench2/
bench2.cpp: *L*
bench2.hpp: *L*
bench21.cpp: *L*
bench22.cpp: *L*
bench23.cpp: *L*
libs/numeric/ublas/bench3/
bench3.cpp: *L*
bench3.hpp: *L*
bench31.cpp: *L*
bench32.cpp: *L*
bench33.cpp: *L*
libs/numeric/ublas/bench4/
bench4.cpp: *L*
bench41.cpp: *L*
bench42.cpp: *L*
bench43.cpp: *L*
libs/numeric/ublas/doc/
Release_notes.txt: *C* *L*
array_adaptor.htm: *C* *L*
banded.htm: *L*
blas.htm: *L*
bounded_array.htm: *C* *L*
container_concept.htm: *L*
doxygen.css: *C* *L*
expression_concept.htm: *L*
hermitian.htm: *L*
index.htm: *L*
iterator_concept.htm: *L*
matrix.htm: *L*
matrix_expression.htm: *L*
matrix_proxy.htm: *L*
matrix_sparse.htm: *L*
operations_overview.htm: *L*
overview.htm: *L*
products.htm: *L*
range.htm: *C* *L*
libs/numeric/ublas/doc/samples/
banded_adaptor.cpp: *L*
banded_matrix.cpp: *L*
bounded_array.cpp: *L*
compressed_matrix.cpp: *L*
compressed_vector.cpp: *L*
coordinate_matrix.cpp: *L*
coordinate_vector.cpp: *L*
hermitian_adaptor.cpp: *L*
hermitian_matrix.cpp: *L*
identity_matrix.cpp: *L*
map_array.cpp: *L*
mapped_matrix.cpp: *L*
mapped_vector.cpp: *L*
matrix.cpp: *L*
matrix_binary.cpp: *L*
matrix_binary_scalar.cpp: *L*
matrix_column.cpp: *L*
matrix_column_project.cpp: *L*
matrix_matrix_binary.cpp: *L*
matrix_matrix_solve.cpp: *L*
matrix_range.cpp: *L*
matrix_range_project.cpp: *L*
matrix_row.cpp: *L*
matrix_row_project.cpp: *L*
matrix_slice.cpp: *L*
matrix_slice_project.cpp: *L*
matrix_unary.cpp: *L*
matrix_vector_binary.cpp: *L*
matrix_vector_range.cpp: *L*
matrix_vector_slice.cpp: *L*
matrix_vector_solve.cpp: *L*
range.cpp: *L*
slice.cpp: *L*
symmetric_adaptor.cpp: *L*
symmetric_matrix.cpp: *L*
triangular_adaptor.cpp: *L*
triangular_matrix.cpp: *L*
unbounded_array.cpp: *L*
unit_vector.cpp: *L*
vector.cpp: *L*
vector_binary.cpp: *L*
vector_binary_outer.cpp: *L*
vector_binary_redux.cpp: *L*
vector_binary_scalar.cpp: *L*
vector_range.cpp: *L*
vector_range_project.cpp: *L*
vector_slice.cpp: *L*
vector_slice_project.cpp: *L*
vector_unary.cpp: *L*
vector_unary_redux.cpp: *L*
zero_matrix.cpp: *L*
zero_vector.cpp: *L*
libs/numeric/ublas/doc/
storage_concept.htm: *C* *L*
storage_sparse.htm: *L*
symmetric.htm: *L*
triangular.htm: *L*
types_overview.htm: *L*
ublas.css: *C* *L*
unbounded_array.htm: *C* *L*
vector.htm: *L*
vector_expression.htm: *L*
vector_proxy.htm: *L*
vector_sparse.htm: *L*
libs/numeric/ublas/test/
README: *C* *L*
concepts.cpp: *L*
test1.cpp: *L*
test1.hpp: *L*
test11.cpp: *L*
test12.cpp: *L*
test13.cpp: *L*
test2.cpp: *L*
test2.hpp: *L*
test21.cpp: *L*
test22.cpp: *L*
test23.cpp: *L*
test3.cpp: *L*
test3.hpp: *L*
test31.cpp: *L*
test32.cpp: *L*
test33.cpp: *L*
test4.cpp: *L*
test4.hpp: *L*
test42.cpp: *L*
test43.cpp: *L*
test5.cpp: *L*
test5.hpp: *L*
test52.cpp: *L*
test53.cpp: *L*
test6.cpp: *L*
test6.hpp: *L*
test62.cpp: *L*
test63.cpp: *L*
test7.cpp: *L*
test7.hpp: *L*
test71.cpp: *L*
test72.cpp: *L*
test73.cpp: *L*
|optional|
libs/optional/test/
Jamfile.v2: *L*
|people|
people/
paul_moore.htm: *C* *L*
vesa_karvonen.htm: *C* *L*
|program_options|
boost/program_options/detail/
utf8_codecvt_facet.hpp: *L*
libs/program_options/build/
Jamfile.v2: *C* *L*
libs/program_options/doc/
Jamfile.v2: *C* *L*
acknowledgements.xml: *C* *L*
changes.xml: *C* *L*
design.xml: *C* *L*
glossary.xml: *C* *L*
howto.xml: *C* *L*
overview.xml: *C* *L*
post_review_plan.txt: *C* *L*
todo.txt: *C* *L*
tutorial.xml: *C* *L*
libs/program_options/example/
Jamfile.v2: *C* *L*
libs/program_options/test/
Jamfile.v2: *C* *L*
program_options_size_test.py: *C* *L*
ucs2.txt: *C* *L*
utf8.txt: *C* *L*
winmain.py: *C* *L*
|property_map|
libs/property_map/
LvaluePropertyMap.html: *L*
ReadWritePropertyMap.html: *L*
ReadablePropertyMap.html: *L*
WritablePropertyMap.html: *L*
associative_property_map.html: *L*
const_assoc_property_map.html: *L*
libs/property_map/doc/
dynamic_property_map.html: *C* *L*
dynamic_property_map.rst: *C* *L*
libs/property_map/
example2.cpp: *L*
identity_property_map.html: *L*
iterator_property_map.html: *L*
property_map.html: *L*
vector_property_map.html: *L*
|ptr_container|
libs/ptr_container/doc/
default.css: *L*
intro.xml: *C* *L*
ptr_container.xml: *L*
libs/ptr_container/test/
Jamfile.v2: *C* *L*
sequence_point.cpp: *C* *L*
|python|
libs/python/doc/
internals.html: *L*
internals.rst: *L*
libs/python/test/
operators_wrapper.cpp: *C* *L*
operators_wrapper.py: *C* *L*
|rational|
boost/
rational.hpp: *L*
libs/rational/
index.html: *L*
rational.html: *L*
rational_example.cpp: *L*
rational_test.cpp: *L*
|regex|
libs/regex/build/
gcc-shared.mak: *C* *L*
libs/regex/example/timer/
input_script.txt: *C* *L*
|regression|
tools/regression/build/
Jamfile.v2: *C* *L*
tools/regression/detail/
tiny_xml_test.txt: *C* *L*
tools/regression/
index.htm: *C* *L*
run_tests.sh: *C* *L*
tools/regression/test/test-cases/general/expected/
results.xml: *C* *L*
tools/regression/test/test-cases/incremental/expected/
results.xml: *C* *L*
tools/regression/test/
test.bat: *C* *L*
tools/regression/xsl_reports/
boostbook_report.py: *C* *L*
tools/regression/xsl_reports/db/
load.py: *C* *L*
test-runs.xsd: *C* *L*
tools/regression/xsl_reports/
empty_expected_results.xml: *C* *L*
tools/regression/xsl_reports/runner/
__init__.py: *C* *L*
default.css: *L*
instructions.html: *L*
instructions.rst: *C* *L*
tools/regression/xsl_reports/test/
common.py: *C* *L*
expected_results.xml: *C* *L*
generate_test_results.py: *C* *L*
generate_test_results_v1.py: *C* *L*
restrict_to_library.xsl: *C* *L*
run_notes_regression.py: *C* *L*
run_v1.py: *C* *L*
tools/regression/xsl_reports/test/test-components/
test.py: *C* *L*
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/
compile-fail.xml: *C* *L*
completed.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/expected/
compile-fail.xml: *C* *L*
completed.xml: *C* *L*
lib.xml: *C* *L*
misfire.xml: *C* *L*
no-run.xml: *C* *L*
run_pyd.xml: *C* *L*
test-case.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_is_test_log_complete/
lib.xml: *L*
misfire.xml: *C* *L*
no-run.xml: *C* *L*
run_pyd.xml: *C* *L*
test-case.xml: *L*
test-driver.xsl: *C* *L*
tools/regression/xsl_reports/test/test-components/test_re_match/expected/
test_re_match.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_case_status/
a.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_case_status/expected/
a.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_case_status/
test-driver.xsl: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_structure/
a.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_structure/expected/
a.xml: *C* *L*
tools/regression/xsl_reports/test/test-components/test_test_structure/
test-driver.xsl: *C* *L*
tools/regression/xsl_reports/test/
test.py: *C* *L*
test_boost_wide_report.py: *C* *L*
tools/regression/xsl_reports/
test_results.xsd: *C* *L*
tools/regression/xsl_reports/utils/
__init__.py: *C* *L*
accept_args.py: *C* *L*
char_translation_table.py: *C* *L*
check_existance.py: *C* *L*
checked_system.py: *C* *L*
libxslt.py: *C* *L*
log.py: *C* *L*
makedirs.py: *C* *L*
send_mail.py: *C* *L*
sourceforge.py: *C* *L*
tar.py: *C* *L*
zip.py: *C* *L*
tools/regression/xsl_reports/xsl/v2/
expected_to_1_33_format.xsl: *C* *L*
|release|
tools/release/
utils.py: *C* *L*
|serialization|
libs/serialization/doc/
style.css: *C* *L*
libs/serialization/example/
demo_output.txt: *C* *L*
demo_save.xml: *C* *L*
demofile.txt: *C* *L*
libs/serialization/test/
run_archive_test.bat: *C* *L*
runtest.bat: *C* *L*
runtest.sh: *C* *L*
libs/serialization/vc7ide/
readme.txt: *C* *L*
|signals|
libs/signals/doc/
tutorial.xml: *C* *L*
|smart_ptr|
libs/smart_ptr/
compatibility.htm: *L*
scoped_array.htm: *L*
scoped_ptr.htm: *L*
shared_array.htm: *L*
shared_ptr.htm: *L*
smart_ptr.htm: *L*
smarttests.htm: *L*
weak_ptr.htm: *L*
|test|
boost/test/utils/runtime/cla/detail/
argument_value_usage.hpp: *L*
libs/test/test/auto-link-test/
run_bjam.bat: *C* *L*
|timer|
libs/timer/
timer.htm: *L*
|tr1|
boost/tr1/
tuple.hpp: *C* *L*
|tuple|
libs/tuple/doc/
design_decisions_rationale.html: *L*
tuple_advanced_interface.html: *L*
tuple_users_guide.html: *L*
libs/tuple/test/
README: *C* *L*
|utility|
boost/
shared_container_iterator.hpp: *L*
libs/utility/
OptionalPointee.html: *L*
call_traits.htm: *L*
compressed_pair.htm: *L*
enable_if.html: *L*
libs/utility/test/
Jamfile.v2: *L*
libs/utility/
utility.htm: *L*
value_init.htm: *L*
value_init_test.cpp: *C*
value_init_test_fail1.cpp: *C*
value_init_test_fail2.cpp: *C*
value_init_test_fail3.cpp: *C*
|variant|
libs/variant/doc/
Jamfile.v2: *C* *L*
biblio.xml: *C* *L*
design.xml: *C* *L*
introduction.xml: *C* *L*
misc.xml: *C* *L*
libs/variant/doc/reference/
apply_visitor.xml: *C* *L*
bad_visit.xml: *C* *L*
concepts.xml: *C* *L*
get.xml: *C* *L*
recursive_variant.xml: *C* *L*
recursive_wrapper.xml: *C* *L*
reference.xml: *C* *L*
static_visitor.xml: *C* *L*
variant.xml: *C* *L*
variant_fwd.xml: *C* *L*
visitor_ptr.xml: *C* *L*
libs/variant/doc/tutorial/
advanced.xml: *C* *L*
basic.xml: *C* *L*
tutorial.xml: *C* *L*
libs/variant/doc/
variant.xml: *L*
libs/variant/
index.html: *C* *L*
libs/variant/test/
Jamfile.v2: *L*
1
0
Boost Regression test failures
Report time: 2007-04-12T05:28:33Z
This report lists all regression test failures on release platforms.
Detailed report:
http://engineering.meta-comm.com/boost-regression/CVS-RC_1_34_0/developer/i…
1 failures in 1 libraries
graph (1)
|graph|
graphviz_test: gcc-cygwin-3.4.4
1
0
[filesystem] Puzzling behaviour on MSVC 7.1 with ofstream and wpath in binary mode
by Eoin O'Callaghan 12 Apr '07
by Eoin O'Callaghan 12 Apr '07
12 Apr '07
Hello, I posted this previously to the Boost-Users list, sorry for the
double post but in hindsight this list is probably much more appropriate.
My development platform is Win XP with sp2. I am using a very recent
(no older than a week) copy of the boost cvs version 1.34rc and the
compilers are MSVC 7.1 and 8.0 both with the service packs.
I've encountered some puzzling behaviour with filesystem::wpath's and
filesystem::ofstream's when opened in binary mode and compiled with
VC++ 7.1.
When I attempt to open a binary ofstream with a wpath as its filename
it will fail if the file did not already exist. This appears to be
contrary to when the filename argument is a narrow filesystem::path.
When the binary mode is not specified both files are created.
Attached is a very small app. demonstrating the inconsistency. This
only occurs with 7.1, when compiled with 8.0 both files will be
created if they did not already exist.
Kind regards, Eoin.
------------------------------------------------------------------------
#include <iostream>
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp>
namespace fs = boost::filesystem;
int main()
{
fs::wpath wide_filename = L"./Wide.txt";
fs::path narrow_filename = "./Narrow.txt";
fs::ofstream wide_fs(wide_filename, fs::fstream::binary);
std::cout << ((wide_fs.is_open()) ?
"Wide file open." : "Wide file not open.")
<< std::endl;
fs::ofstream narrow_fs(narrow_filename, fs::fstream::binary);
std::cout << ((narrow_fs.is_open()) ?
"Narrow file open." : "Narrow file not open.")
<< std::endl;
return 0;
}
1
0
Hi.
I believe the modifications done in
http://boost.cvs.sourceforge.net/boost/boost/libs/graph/src/graphml.cpp?r1=…
break xml namespace processing, since it will strip any namespace
information from all tags (everything before "|"), not only those which
belong to the graphml namespace. So, tags belonging to other namespaces,
such as "foo:node", will be wrongly parsed as graphml tags, eg. "node"...
I'm sending attached patches which revert to the old behavior and have
two further modifications:
- Better expat error handling. It now informs the user where in the file
a problem occured
- Reordering of tag processing for possible speed improvement ("node" is
more frequent than "graph", so it should be tested first, etc)
I'm also sending slightly improved documentation and test case.
Besides this I have a couple of questions:
1- How should graph properties be handled? I did include support for it,
using dynamic_properties map with a key type equal to the graph type,
but I don't know if that's the proper way to do it.
2- Some of the exceptions are shared with the graphviz reader, but those
exceptions have the name "graphviz" in their error strings, and thus
create confusing messages when used with the graphml reader. Perhaps
those strings should be edited in the graphviz code?
Thanks!
--
Tiago de Paula Peixoto <tiago(a)forked.de>
============================
|(logo)|__ ``read_graphml``
============================
.. |(logo)| image:: ../../../boost.png
:align: middle
:alt: Boost
__ ../../../index.htm
::
void read_graphml(std::istream& in, MutableGraph& graph,
dynamic_properties& dp);
The ``read_graphml`` function interprets a graph described using the
graphml_ format and builds a BGL graph that captures that
description. Using this function, you can initialize a graph using
data stored as text.
The graphml format can specify both directed and undirected graphs, and
``read_graphml`` differentiates between the two. One must pass
``read_graphml`` an undirected graph when reading an undirected graph;
the same is true for directed graphs. Furthermore, ``read_graphml``
will throw an exception if it encounters parallel edges and cannot add
them to the graph.
To handle attributes expressed in the graphml format, ``read_graphml``
takes a dynamic_properties_ object and operates on its collection of
property maps. The reader passes all the properties encountered to
this object, using the graphml attribute names as the property names,
and with the appropriate C++ value type based on the graphml attribute type
definition. Graph properties are also set with the same
dynamic_properties object, where the key type is the type of the graph itself.
Requirements:
- The type of the graph must model the `Mutable Graph`_ concept.
- The type of the iterator must model the `Multi-Pass Iterator`_
concept.
- The property map value types must be default-constructible.
.. contents::
Where Defined
-------------
``<boost/graph/graphml.hpp>``
Exceptions
----------
::
struct graph_exception : public std::exception {
virtual ~graph_exception() throw();
virtual const char* what() const throw() = 0;
};
struct bad_parallel_edge : public graph_exception {
std::string from;
std::string to;
bad_parallel_edge(const std::string&, const std::string&);
virtual ~bad_parallel_edge() throw();
const char* what() const throw();
};
struct directed_graph_error : public graph_exception {
virtual ~directed_graph_error() throw();
virtual const char* what() const throw();
};
struct undirected_graph_error : public graph_exception {
virtual ~undirected_graph_error() throw();
virtual const char* what() const throw();
};
struct parse_error : public graph_exception {
parse_error(const std::string&);
virtual ~parse_error() throw() {}
virtual const char* what() const throw();
std::string statement;
std::string error;
};
Under certain circumstances, ``read_graphml`` will throw one of the
above exceptions. The three concrete exceptions can all be caught
using the general ``graph_exception`` moniker when greater precision
is not needed. In addition, all of the above exceptions derive from
the standard ``std::exception`` for even more generalized error
handling.
The ``bad_parallel_edge`` exception is thrown when an attempt to add a
parallel edge to the supplied MutableGraph fails. The graphml format
supports parallel edges, but some BGL-compatible graph types do not.
One example of such a graph is ``boost::adjacency_list<setS,vecS>``,
which allows at most one edge can between any two vertices.
The ``directed_graph_error`` exception occurs when an undirected graph
type is passed to ``read_graph``, but the graph defined in the graphml
file contains at least one directed edge.
The ``undirected_graph_error`` exception occurs when a directed graph
type is passed to ``read_graph``, but the graph defined in the graphml
file contains at least one undirected edge.
The ``parse_error`` exception occurs when a syntax error is
encountered in the graphml file. The error string will contain the
line and column where the error was encountered.
Building the graphml reader
-----------------------------
To use the graphml reader, you will need to build and link against
the "bgl-graphml" library. The library can be built by following the
`Boost Jam Build Instructions`_ for the subdirectory ``libs/graph/build``.
Notes
-----
- On successful reading of a graph, every vertex and edge will have
an associated value for every respective edge and vertex property
encountered while interpreting the graph. These values will be set
using the ``dynamic_properties`` object. Some properties may be
``put`` multiple times during the course of reading in order to
ensure the graphml semantics. Those edges and vertices that are
not explicitly given a value for a property (and that property has
no default) will be given the default constructed value of the
value type. **Be sure that property map value types are default
constructible.**
- Nested graphs are supported as long as they are exactly of the same
type as the root graph, i.e., are also directed or undirected. Note
that since nested graphs are not directly supported by BGL, they
are in fact completely ignored when building the graph, and the
internal vertices or edges are interpreted as belonging to the root
graph.
- Hyperedges and Ports are not supported.
See Also
--------
write_graphml_
.. _Graphml: http://graphml.graphdrawing.org/
.. _`Mutable Graph`: MutableGraph.html
.. _`Multi-Pass Iterator`: ../../iterator/index.html
.. _dynamic_properties: ../../property_map/doc/dynamic_property_map.html
.. _write_graphml: write_graphml.html
.. _Boost Jam Build Instructions: ../../../more/getting_started.html#Build_Install
============================
|(logo)|__ ``write_graphml``
============================
.. |(logo)| image:: ../../../boost.png
:align: middle
:alt: Boost
__ ../../../index.htm
::
template<typename Graph>
void
write_graphml(std::ostream& out, const Graph& g, const dynamic_properties& dp,
bool ordered_vertices=false);
template<typename Graph, typename VertexIndexMap>
void
write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
const dynamic_properties& dp, bool ordered_vertices=false);
This is to write a BGL graph object into an output stream in the
graphml_ format. Both overloads of ``write_graphml`` will emit all of
the properties stored in the dynamic_properties_ object, thereby
retaining the properties that have been read in through the dual
function read_graphml_. The second overload must be used when the
graph doesn't have an internal vertex index map, which must then be
supplied with the appropriate parameter.
.. contents::
Where Defined
-------------
``<boost/graph/graphml.hpp>``
Parameters
----------
OUT: ``std::ostream& out``
A standard ``std::ostream`` object.
IN: ``VertexListGraph& g``
A directed or undirected graph. The
graph's type must be a model of VertexListGraph_. If the graph
doesn't have an internal ``vertex_index`` property map, one
must be supplied with the vertex_index parameter.
IN: ``VertexIndexMap vertex_index``>
A vertex property map containing the indexes in the range
[0,num_vertices(g)].
IN: ``dynamic_properties& dp``
Contains all of the vertex, edge and graph properties that should be
emitted by the graphml writer.
IN: ``bool ordered_vertices``
This tells whether or not the order of the vertices from vertices(g)
matches the order of the indexes. If ``true``, the ``parse.nodeids``
graph attribute will be set to ``canonical``. Otherwise it will be
set to ``free``.
Example
-------
This example demonstrates using BGL-graphml interface to write
a BGL graph into a graphml format file.
::
enum files_e { dax_h, yow_h, boz_h, zow_h, foo_cpp,
foo_o, bar_cpp, bar_o, libfoobar_a,
zig_cpp, zig_o, zag_cpp, zag_o,
libzigzag_a, killerapp, N };
const char* name[] = { "dax.h", "yow.h", "boz.h", "zow.h", "foo.cpp",
"foo.o", "bar.cpp", "bar.o", "libfoobar.a",
"zig.cpp", "zig.o", "zag.cpp", "zag.o",
"libzigzag.a", "killerapp" };
int main(int,char*[])
{
typedef pair<int,int> Edge;
Edge used_by[] = {
Edge(dax_h, foo_cpp), Edge(dax_h, bar_cpp), Edge(dax_h, yow_h),
Edge(yow_h, bar_cpp), Edge(yow_h, zag_cpp),
Edge(boz_h, bar_cpp), Edge(boz_h, zig_cpp), Edge(boz_h, zag_cpp),
Edge(zow_h, foo_cpp),
Edge(foo_cpp, foo_o),
Edge(foo_o, libfoobar_a),
Edge(bar_cpp, bar_o),
Edge(bar_o, libfoobar_a),
Edge(libfoobar_a, libzigzag_a),
Edge(zig_cpp, zig_o),
Edge(zig_o, libzigzag_a),
Edge(zag_cpp, zag_o),
Edge(zag_o, libzigzag_a),
Edge(libzigzag_a, killerapp)
};
const int nedges = sizeof(used_by)/sizeof(Edge);
typedef adjacency_list< vecS, vecS, directedS,
property< vertex_color_t, string >,
property< edge_weight_t, int >
> Graph;
Graph g(used_by, used_by + nedges, N);
graph_traits<Graph>::vertex_iterator v, v_end;
for (tie(v,v_end) = vertices(g); v != v_end; ++v)
put(vertex_color_t(), g, *v, name[*v]);
graph_traits<Graph>::edge_iterator e, e_end;
for (tie(e,e_end) = edges(g); e != e_end; ++e)
put(edge_weight_t(), g, *e, 3);
dynamic_properties dp;
dp.property("name", get(vertex_color_t(), g));
dp.property("weight", get(edge_weight_t(), g));
write_graphml(std::cout, g, dp, true);
}
The output will be:
::
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml http://graphml.graphdrawing.org/xmlns/graphml/graphml-attributes-1.0rc.xsd">
<key id="key0" for="node" attr.name="name" attr.type="string" />
<key id="key1" for="edge" attr.name="weight" attr.type="int" />
<graph id="G" edgedefault="directed" parse.nodeids="canonical" parse.edgeids="canonical" parse.order="nodesfirst">
<node id="n0">
<data key="key0">dax.h</data>
</node>
<node id="n1">
<data key="key0">yow.h</data>
</node>
<node id="n2">
<data key="key0">boz.h</data>
</node>
<node id="n3">
<data key="key0">zow.h</data>
</node>
<node id="n4">
<data key="key0">foo.cpp</data>
</node>
<node id="n5">
<data key="key0">foo.o</data>
</node>
<node id="n6">
<data key="key0">bar.cpp</data>
</node>
<node id="n7">
<data key="key0">bar.o</data>
</node>
<node id="n8">
<data key="key0">libfoobar.a</data>
</node>
<node id="n9">
<data key="key0">zig.cpp</data>
</node>
<node id="n10">
<data key="key0">zig.o</data>
</node>
<node id="n11">
<data key="key0">zag.cpp</data>
</node>
<node id="n12">
<data key="key0">zag.o</data>
</node>
<node id="n13">
<data key="key0">libzigzag.a</data>
</node>
<node id="n14">
<data key="key0">killerapp</data>
</node>
<edge id="e0" source="n0" target="n4">
<data key="key1">3</data>
</edge>
<edge id="e1" source="n0" target="n6">
<data key="key1">3</data>
</edge>
<edge id="e2" source="n0" target="n1">
<data key="key1">3</data>
</edge>
<edge id="e3" source="n1" target="n6">
<data key="key1">3</data>
</edge>
<edge id="e4" source="n1" target="n11">
<data key="key1">3</data>
</edge>
<edge id="e5" source="n2" target="n6">
<data key="key1">3</data>
</edge>
<edge id="e6" source="n2" target="n9">
<data key="key1">3</data>
</edge>
<edge id="e7" source="n2" target="n11">
<data key="key1">3</data>
</edge>
<edge id="e8" source="n3" target="n4">
<data key="key1">3</data>
</edge>
<edge id="e9" source="n4" target="n5">
<data key="key1">3</data>
</edge>
<edge id="e10" source="n5" target="n8">
<data key="key1">3</data>
</edge>
<edge id="e11" source="n6" target="n7">
<data key="key1">3</data>
</edge>
<edge id="e12" source="n7" target="n8">
<data key="key1">3</data>
</edge>
<edge id="e13" source="n8" target="n13">
<data key="key1">3</data>
</edge>
<edge id="e14" source="n9" target="n10">
<data key="key1">3</data>
</edge>
<edge id="e15" source="n10" target="n13">
<data key="key1">3</data>
</edge>
<edge id="e16" source="n11" target="n12">
<data key="key1">3</data>
</edge>
<edge id="e17" source="n12" target="n13">
<data key="key1">3</data>
</edge>
<edge id="e18" source="n13" target="n14">
<data key="key1">3</data>
</edge>
</graph>
</graphml>
See Also
--------
_read_graphml
Notes
-----
- Note that you can use graphml file write facilities without the
library ``libbglgraphml.a``.
.. _graphml: http://graphml.graphdrawing.org/
.. _dynamic_properties: ../../property_map/doc/dynamic_property_map.html
.. _read_graphml: read_graphml.html
.. _VertexListGraph: VertexListGraph.html
1
0
I’m happy to report that the quantitative units library developed by
Matthias Schabel and Steven Watanabe has been accepted for inclusion in
boost. My thanks to the authors for their submission, and to the
reviewers for all the work put into the reviews and discussions. A very
busy review period saw contributions ranging from small commentaries to
extensive reviews and discussions from Shaun Bloom, Martin Bonner, Paul
Bristow, Malte Clasen, Phil Endecott, Michael Fawcett, Ben FrantzDale,
Dave Hicherson, Lewis Hyatt, Janek Kozicki, Zach Laine, Eric Lemings,
Kevin Lynch, John Maddock, Michael Marcin, Scott McMurray, Noah Roberts,
Martin Schulz, Andrey Semashev, Dave Steffen, Matthias Troyer, K. R.
Walker, David Walthall, Gunter Winkler and Deane Yang. Thanks to you
again, since without your work the library would not become nearly as
good as it can be.
Given the scale of the review and the large number of issues
discussed, this summary will be rather long. As has been my policy in
the past, I will try to encapsulate the main ideas in the discussions
for ease of later reference. In the case of this library, there are also
some specific recommendations that should be addressed before the
library is added to the CVS. Some of them were fixed by the authors
during the review, and made available at that time, but for completeness
the completed issues will also be included in the report.
I’ll organize the report with some general discussion issues first,
followed by suggestions for improvement for the library (required issues
will be clearly marked and listed first), and since there was a vocal
minority who argued against inclusion, the report will end by
specifically addressing some of the points they raised in the review
discussion.
DISCUSSION
Whether boost should include unit analysis as a compile time library or
a runtime library is an almost religious issue. On each side are
adherents who are strongly committed to their views and who see no way
their needs can be met by the other type of library. However, the goal
of boost is not to decide who is correct in situations of this sort.
Boost was founded to generate good ideas and good implementations so use
by a wide audience could determine which if any of these ideas are
appropriate for addition to the language. Therefore, my suggested
resolution to the compile time vs. runtime issue is for a runtime
adherent to submit a runtime units library that is of sufficient quality
for boost inclusion and let the broader base of programmers decide if
there is a need for one or both libraries.
Since the compile time library is already completed and accepted, it is
reasonable to expect that any runtime submission should either be able
to cleanly interoperate with the compile time version or a convincing
rationale will be supplied for why this is not a reasonable goal. I look
forward to this submission, though I will probably not volunteer to run
the review since I claim no expertise in the issues that runtime
proponents feel make a compile time solution inadequate.
For the moment, I believe there is certainly enough of an audience that
is looking for a compile time solution to justify the need for a
library. I could only find two reviewers who said that a proper solution
couldn’t be formulated with compile time facilities. The implication is
that the rest of the people who expressed opinions about the library did
not consider this an obstacle. In a list of library builders (as the
boost developer list is) I would expect a bias toward compile time
solutions compared to runtime solutions, but not enough of a bias to
make me believe there is not an audience for a compile time solution.
I also think that some of the problems perceived by those who opposed
the library are more communications problems than problems with library
functionality. To try to alleviate this issue, I am insisting that the
documentation adds a rationale section. This section is suggested for
all boost libraries, but is badly needed in a setting where there are
many subtle mistakes of thinking or design that can be made. The authors
showed during the discussions that they have good reasons for their
choices, but some of those reasons are not obvious. A rationale section
that is clear and complete on the topics of what the library is intended
to do, why that is a good idea and how that can be done in C++ will go a
long way to avoid further misunderstandings.
The library uses the type system to make code more readable and more
dependable. However, many commonly used third party libraries are not
built in a way that is compatible with this use of the type system.
Thus, some sort of proxy or façade system will be used in most cases to
provide an interface with third party facilities. My personal preference
is to put the special interface on the unsafe libraries, but either way,
this would be a good choice for a simple example. It also gives a chance
to explain that this is not a flaw in the design of the units library,
but instead an issue with how to communicate between sections of a
program that have incompatible type information. If, in the future the
third party libraries are improved to allow direct communication, the
façade can become a pass through or be removed.
Imperial units (My apologies to Martin for the use of the term.) open a
can of worms, but a nearly unavoidable one. They should either be
included, or a prominent explanation of why they are not included should
be provided.
During the review questions arose of what to do with units such as meter
* furlong / foot. The decision that the default behavior is to not
convert and simplify is IMHO the correct one. In my academic area of
expertise, the units km / (s * Mpc) (kilometers per second per
megaparsec) are an example of a commonly used unit where automatic
simplification is not acceptable. Megaparsecs measure distance, but
should not be used to simplify with the kilometers. (These units are
used to measure the expansion rate of the universe.)
Paul made the case in his review, and I think he is correct, that the
documentation should be very friendly to non-expert C++ programmers.
Many potential users will not be experts in the template system or even
the type system, but will be looking for a way to write more usable code
for manipulating numbers in calculations. The documents should be
written and organized to aid this. My suggestions are that you simplify
the quick start’s discussion of how the library does its job, and focus
on just presenting two problems (the work calculation and the circuit
calculation) and how the units library makes solving those problems
easier and more intuitive. Do it as two problems, each with a reason to
exist, instead of as one mashed together program. Also, the listings for
each example on the examples page should include a short (a few words to
a couple of sentences) description of the problem the example
illustrates and solves. Remember that someone who doesn’t already know
the value of including units in code (and that means almost everyone)
will look at the introduction, the quick start and the examples. If they
aren’t convinced of the utility of the library by then, they’ll stop
looking.
This isn’t a binding suggestion, but right now static_rational is an
implementation detail. As such, I think it should be kept internal to
the library. If it is useful and important enough to move out to its own
library, then pretty it up and submit it for the review process. This
closely follows the pattern established by such useful tools as fusion.
It took some thinking, but I believe the decision not to add
operator++() is a good one. It might be good to include the reasoning
and something like the example that ended that discussion (from Eric, I
think) in the rationale section.
REQUIRED IMPROVEMENTS
Each of the improvements below should be addressed before adding the
library to the CVS.
Add a rationale section to the documentation.
Since the design decisions required for a good units library aren’t
always obvious, you need to include a section that explains the choices
and your reasons for making the design decisions you made. Many things
listed below have a place in this section.
Fix the bugs in conversion/construction.
You already addressed this, but make sure each way to construct a
quantity that should work, does work. Include an explanation of why the
ones that shouldn’t work don’t.
Either include a real performance test, or no performance test.
As the discussion during the reviewed, performance testing is not
trivial, and when done without careful thought creates confusion. If you
can develop a good performance test, include it in the examples or as a
separate program in the documentation. However, example 14 isn’t a good
performance test and confuses people about what is happening in the library.
Check the suggestion about auto generation of ordinal values. If auto
generation works across translation units, use it instead of assigning
values. If auto generation does not work, consider the reserved range
ordinals. This has to be addressed before submission because any later
decision to change the range of reserved ordinals is a potentially
breaking change for users (and probably a very hard one to debug).
Remember that it is better to reserve 3 times too many ordinals than
even 1 too few.
Look at the problems of reworking the library for mpl re-use and
simplifying the conversion implementation. If these projects are of a
reasonable scale to be completed without slowing you down so much that
you miss a release, do them now. Otherwise, implement them after
including the library in the CVS.
Remove the mutating member function x.value(). You have already agreed
that this is a good choice and that needed mutating functionality should
use a more ugly and obvious syntax, such as x.quantity_cast().
You have designed a way to simplify reverse conversions so someone who
adds a new unit system doesn’t have to add redundant conversion
definitions. Include this in the library and documentation.
Include a rationale item that explains why the default behavior is
explicit conversions.
Correct the typos Paul noticed on the work “calculation” in the quick
start.
Provide a clear and complete listing of the systems and units included
in the library.
The use nautical::miles is not consistent with other names. Decide what
naming scheme you want and stick with it.
Include a rationale item that explains the reason for the notation
quantity<SI::length> m_value=3.0 * SI::meter. I think you have a good
reason, but it isn’t explained to the user.
SUGGESTED IMPORVEMENTS
The improvements below are not required, but they are suggestions for
how to make a good submission better. Consider them, and do what you
think will make the best library.
Consider a check for compilers that are known to not be able to compile
the library.
Carefully consider the purpose for each example provided.
What do you expect a reader to learn from each example? What examples
are needed for users who want to write code for the common use cases for
a library of this sort?
Add an item to the rationale to quickly explain why rounding and error
issues are not handled in the library.
Consider changing the notation for negative exponents away from using
parenthesis.
Zach Laine had a collection of suggested edits to the text. Consider how
to best fix them.
One thing that will greatly aid broad adoption is ease of definition for
new units and systems. There are tons of unit systems in the world, and
someone is using each of them. As such, the easier you can make adding
new units and systems, the better. This includes a possible tutorial
showing the process (including discussions of the decisions that must be
made and good ways to make them). It will greatly benefit the authors if
anyone who tries this tells them about what went well and poorly.
Provide clear and detailed examples of implicit and explicit
conversions. Include a discussion of the good and bad points of each.
Consider convenience headers for a variety of typical use cases.
Consider whether you should change the current header arrangement to
make them more or less fine grained.
Consider including a simple currency example, with rates checked at run
time from some simple source.
Consider an example of using the library to interface with a GUI
(similar to Janek’s).
Consider including an example of how to accept a value in units not
known at compile time and convert to a predetermined unit.
You decided the if() check on line 57 of quantity.hpp is not needed.
Check for other unneeded code and remove.
Include the SI prefixes (milli, mega, …) in the SI catchall header.
Since you can’t assume the memory layout of quantities in arrays is the
same as doubles in all cases, consider an optional compile time check on
sizeof() to make sure the size is the same.
Consider adding the example from the discussion of a dual reference
frame system. This is a good use of this library that won’t occur to
many users without help.
Consider opening the constants for use in systems that don’t provide
native typeof(). This might be unimportant, if such systems can’t use
the library for other compatibility reasons.
Documentation is the gift that keeps on giving. Continue to look for
ways to make the documentation more clear and complete.
ISSUES RAISED WITH THE LIBRARY
During the discussion, several issues were raised that have reasonable
answers. I’ll try to collect my understanding of the issues and the
answers here.
It does not allow interaction with a GUI layer.
Janek’s example posted to the discussion shows direct interaction
including the ability to select units at runtime from the GUI. Similar
can be done for other presentation layer issues except for possible
rounding issues, which are inherently hard to solve satisfactorily.
The focus should be on the business and presentation layers.
While both layers are important, there is a substantial audience for
this library that does little to no work with them. If this library
proves insufficient for this work, a runtime submission is encouraged.
Rational exponents are a needless complication and make integration with
a runtime system impossible.
While not everyone has a use for them, there is a noteworthy population
that needs to have them, so they are provided. Similar functionality can
be provided at runtime using boost::rational.
Inadequate serialization tools are provided.
I/O with units is a large and complicated problem all its own. Anyone
who wishes to solve it is welcome to develop a library proposal, but the
scope of this proposal is intentionally limited in this regard.
Workarounds are needed for third party libraries, such as BLAS.
This is true, but a common symptom of any unit system for C++. The only
question is then where the workarounds happen. See above for more on this.
Doesn’t support … (pick your favorite)
So far, Janek has provided code examples for GUI use and Michael tells
us he has used it with OpenGL and other systems. In fact, reasonable
solutions have been provided for every problem presented, so far. There
may be problems of this sort, but no direct evidence has been seen so far.
No check for matching units on deserialized quantities.
This is true to an extent, but not as important as it sounds. The
serialization library provides support for version numbers on archives.
The version number can be propagated between groups along with a
definition of the required data format for that version. Yes, it is
possible for someone to ignore this information, but it is also possible
for them to call their units meters but use numbers that go along with
feet. No unit system can eliminate such intentional circumventions, so
it isn’t very important that this one doesn’t.
Some real world uses of units have improper dimensions. For example
measuring pressures in terms of inches of mercury.
This will probably best be handled at I/O time, and converted to some
more sensible internal unit for the rest of the program. In cases where
this is not a viable answer, I don’t currently have one.
Why distinguish between torque and energy, since the have the same
dimensions?
There are sensible physical problems where torque and energy both
appear, such as rotational energy problems with work. As such,
insulating against accidents is good.
That’s the whole thing.
Thanks to anyone who lasted this long, and thanks once again to the
authors.
John Phillips
9
11
Hi,
I directly skipped to the documentation of the gamma function (I'm
no expert with statistical distributions, so I will only review the
special functions) and I have a few questions related to accuracy.
Sorry if the answers are in the documentation, I couldn't find them.
The accuracy table of the gamma function contains "native peak" and
"(native?) mean" values. What are theses native values and how are
they different from the usual values?
I'm also intrigued by the high values of peak and mean for IA32/gcc.
Why are they different from the values for IA64/gcc? Are you using
other datatypes internally? (I haven't looked at the implementation
yet.) Thanks.
Best regards,
Guillaume
PS: the documentation seems really nice. Good job.
2
2
Hi,
I first created my project using BGL under Visual C++. The project works fine.
Then, I want to compile the source files using gcc in linux environment. I got
a lot of errors by simply calling (gcc mainfile.cpp). Errors such as :
/usr/include/boost/pending/stringtok.hpp:64: error: redefinition of `bool
<unnamed>::isws(char, const char*)'
/usr/include/boost/pending/stringtok.hpp:64: error: `bool <unnamed>::isws(char,
const char*)' previously defined here
/usr/include/boost/pending/stringtok.hpp: At global scope:
/usr/include/boost/pending/stringtok.hpp:83: error: redefinition of `
template<class Container> void boost::stringtok(Container&, const
std::string&, const char*)'
Thanks for your help.
Abdel.
5
4