#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #include #include #include #include #include #include #include */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Quantity.hxx" //#define TEST_QUANTITIES #define TEST_ASSERT_ON_FAILURE #ifdef TEST_QUANTITIES namespace Test_Quantities { /*----- test_XXX_quantity_parser ----------------------------------------*/ static bool test_length_quantity_parser(); static bool test_dbl_length_quantity_parser(); } // namespace Test_Quantities #endif // TEST_QUANTITIES namespace Quantities { namespace un = ::boost::units; namespace qi = ::boost::spirit::qi; namespace iso8859_1 = ::boost::spirit::iso8859_1; /*----- length_units_t --------------------------------------------------*/ struct length_units_t : qi::symbols { length_units_t() { add // ( "Ym", 1.e24 * un::si::meters ) // yottameter // ( "yottameter", 1.e24 * un::si::meters ) // yottameter // ( "Zm", 1.e21 * un::si::meters ) // zettameter // ( "zettameter", 1.e21 * un::si::meters ) // zettameter // ( "em", 1.e18 * un::si::meters ) // exameter // ( "exameter", 1.e18 * un::si::meters ) // exameter // ( "Pm", 1.e15 * un::si::meters ) // petameter // ( "petameter", 1.e15 * un::si::meters ) // petameter // ( "Tm", 1.e12 * un::si::meters ) // terrameter // ( "terrameter", 1.e12 * un::si::meters ) // terrameter // ( "Gm", 1.e9 * un::si::meters ) // gigameter // ( "gigameter", 1.e9 * un::si::meters ) // gigameter ( "Mm", 1.e6 * un::si::meters ) // megameter ( "megameter", 1.e6 * un::si::meters ) // megameter ( "km", 1.e3 * un::si::meters ) // kilometer ( "kilometer", 1.e3 * un::si::meters ) // kilometer ( "hm", 1.e2 * un::si::meters ) // hectometer ( "hectometer", 1.e2 * un::si::meters ) // hectometer ( "dam", 1.e1 * un::si::meters ) // decameter ( "decameter", 1.e1 * un::si::meters ) // decameter ( "m", 1.e-0 * un::si::meters ) // meter ( "meter", 1.e-0 * un::si::meters ) // meter ( "dm", 1.e-1 * un::si::meters ) // decimeter ( "decimeter", 1.e-1 * un::si::meters ) // decimeter ( "cm", 1.e-2 * un::si::meters ) // centimeter ( "centimeter", 1.e-2 * un::si::meters ) // centimeter ( "mm", 1.e-3 * un::si::meters ) // millimeter ( "millimeter", 1.e-3 * un::si::meters ) // millimeter ( "um", 1.e-6 * un::si::meters ) // micrometer ( "µm", 1.e-6 * un::si::meters ) // micrometer ( "micrometer", 1.e-6 * un::si::meters ) // micrometer ( "nm", 1.e-9 * un::si::meters ) // nanometer ( "nanometer", 1.e-9 * un::si::meters ) // nanometer ( "pm", 1.e-12 * un::si::meters ) // picometer ( "picometer", 1.e-12 * un::si::meters ) // picometer // ( "fm", 1.e-15 * un::si::meters ) // femtometer // ( "femtometer", 1.e-15 * un::si::meters ) // femtometer // ( "am", 1.e-18 * un::si::meters ) // attometer // ( "attometer", 1.e-18 * un::si::meters ) // attometer // ( "zm", 1.e-21 * un::si::meters ) // zeptometer // ( "zeptometer", 1.e-21 * un::si::meters ) // zeptometer // ( "ym", 1.e-24 * un::si::meters ) // yoctometer // ( "yoctometer", 1.e-24 * un::si::meters ) // yoctometer ( "ft", conversion_factor(un::imperial:: foot_base_unit::unit_type(), un::si::meter) * un::si::meter ) // foot ( "foot", conversion_factor(un::imperial:: foot_base_unit::unit_type(), un::si::meter) * un::si::meter ) // foot ( "in", conversion_factor(un::imperial:: inch_base_unit::unit_type(), un::si::meter) * un::si::meter ) // inch ( "inch", conversion_factor(un::imperial:: inch_base_unit::unit_type(), un::si::meter) * un::si::meter ) // inch ( "mi", conversion_factor(un::imperial:: mile_base_unit::unit_type(), un::si::meter) * un::si::meter ) // mile ( "mile", conversion_factor(un::imperial:: mile_base_unit::unit_type(), un::si::meter) * un::si::meter ) // mile ( "yd", conversion_factor(un::imperial:: yard_base_unit::unit_type(), un::si::meter) * un::si::meter ) // yard ( "yard", conversion_factor(un::imperial:: yard_base_unit::unit_type(), un::si::meter) * un::si::meter ) // yard ( "league", conversion_factor(un::imperial:: league_base_unit::unit_type(), un::si::meter) * un::si::meter ) // league ( "furlong", conversion_factor(un::imperial:: furlong_base_unit::unit_type(), un::si::meter) * un::si::meter ) // furlong ( "thou", conversion_factor(un::imperial:: thou_base_unit::unit_type(), un::si::meter) * un::si::meter ) // thou ( "angstrom", conversion_factor(un::metric:: angstrom_base_unit::unit_type(), un::si::meter) * un::si::meter ) // angstrom ( "Å", conversion_factor(un::metric:: angstrom_base_unit::unit_type(), un::si::meter) * un::si::meter ) // angstrom ( "fermi", conversion_factor(un::metric:: fermi_base_unit::unit_type(), un::si::meter) * un::si::meter ) // fermi ( "micron", conversion_factor(un::metric:: micron_base_unit::unit_type(), un::si::meter) * un::si::meter ) // micron ( "nautical mile", conversion_factor(un::metric:: nautical_mile_base_unit::unit_type(), un::si::meter) * un::si::meter ) // nautical mile ( "nmi", conversion_factor(un::metric:: nautical_mile_base_unit::unit_type(), un::si::meter) * un::si::meter ) // nautical mile // ( "a.u.", conversion_factor(un::astronomical::astronomical_unit_base_unit::unit_type(), un::si::meter) * un::si::meter ) // astronomical unit // ( "astronomical unit", conversion_factor(un::astronomical::astronomical_unit_base_unit::unit_type(), un::si::meter) * un::si::meter ) // astronomical unit // ( "ldy", conversion_factor(un::astronomical:: light_day_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light day // ( "light day", conversion_factor(un::astronomical:: light_day_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light day // ( "lhr", conversion_factor(un::astronomical:: light_hour_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light hour // ( "light hour", conversion_factor(un::astronomical:: light_hour_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light hour // ( "lmn", conversion_factor(un::astronomical:: light_minute_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light minute // ( "light minute", conversion_factor(un::astronomical:: light_minute_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light minute // ( "ly", conversion_factor(un::astronomical:: light_year_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light year // ( "light year", conversion_factor(un::astronomical:: light_year_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light year // ( "lsc", conversion_factor(un::astronomical:: light_second_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light second // ( "light second", conversion_factor(un::astronomical:: light_second_base_unit::unit_type(), un::si::meter) * un::si::meter ) // light second // ( "psc", conversion_factor(un::astronomical:: parsec_base_unit::unit_type(), un::si::meter) * un::si::meter ) // parsec // ( "parsec", conversion_factor(un::astronomical:: parsec_base_unit::unit_type(), un::si::meter) * un::si::meter ) // parsec ; } } length_units_; /*----- mixed_real_policies ---------------------------------------------*/ template struct mixed_real_policies : qi::real_policies { template static bool parse_dot(Iterator& first, Iterator const& last) { if (first == last || (*first != ',' && *first != '.')) return false; ++first; return true; } }; /*----- mixed_double ----------------------------------------------------*/ typedef qi::real_parser > mixed_double; mixed_double mixed_double_; /*----- length_quantity_grammer -----------------------------------------*/ template struct length_quantity_grammer : qi::grammar { length_quantity_t build_quantity() { return base_ * length_unit_; } length_quantity_grammer(const length_quantity_t& length_unit) : length_quantity_grammer::base_type(start_) , base_(0.0) , length_unit_(length_unit) { using qi::eps; using qi::eoi; using qi::double_; using qi::_1; using qi::_val; using boost::phoenix::ref; typedef length_quantity_grammer self_type; start_ = eps[_val = 0.0 * length_unit] >> quantity_[_val = boost::phoenix::bind(&self_type::build_quantity, this)]; quantity_ = mixed_double_[ref(base_) = _1] >> -length_units_[ref(length_unit_) = _1]; } double base_; length_quantity_t length_unit_; qi::rule start_; qi::rule quantity_; }; /*----- parse_length_quantity_impl --------------------------------------*/ template static bool parse_length_quantity_impl( Iterator first, Iterator last, length_quantity_t& length, const length_quantity_t& length_unit) { using qi::phrase_parse; using iso8859_1::space; length_quantity_grammer grammer(length_unit); bool r = phrase_parse(first, last, grammer, iso8859_1::space, length); if (!r || first != last) return false; return true; } /*----- parse_dbl_length_quantity_impl ----------------------------------*/ template static int parse_dbl_length_quantity_impl( Iterator input, Iterator last, length_quantity_t& length1, length_quantity_t& length2, const length_quantity_t& length_unit) { using qi::_1; using qi::eoi; using qi::char_; using qi::omit; using qi::phrase_parse; using iso8859_1::space; using boost::phoenix::ref; length_quantity_grammer grammar(length_unit); qi::rule pr1 = grammar[ref(length1) = _1] >> omit[-char_("xX:&,|")] >> grammar[ref(length2) = _1] >> eoi; qi::rule pr2 = grammar[ref(length1) = _1] >> -omit[-char_("xX:&,|")] >> eoi; qi::rule pr3 = omit[-char_("xX:&,|")] >> grammar[ref(length2) = _1] >> eoi; Iterator first = input; bool r = phrase_parse(first, last, pr1, iso8859_1::space); if (r && first == last) return 1; first = input; r = phrase_parse(first, last, pr2, iso8859_1::space); if (r && first == last) return 2; first = input; r = phrase_parse(first, last, pr3, iso8859_1::space); if (r && first == last) return 3; return 0; } /*----- INTERFACE -------------------------------------------------------*/ /*----- parse_length_quantity -------------------------------------------*/ OptLengthQuantityT parse_length_quantity( const std::string& input, const length_quantity_t& length_unit) { length_quantity_t length; bool r = parse_length_quantity_impl(input.begin(), input.end(), length, length_unit); if (r) return OptLengthQuantityT(length); return boost::none; } /*----- parse_dbl_length_quantity ---------------------------------------*/ PairOptLengthQuantityT parse_dbl_length_quantity( const std::string& input, const length_quantity_t& length_unit) { length_quantity_t length1; length_quantity_t length2; int r = parse_dbl_length_quantity_impl(input.begin(), input.end(), length1, length2, length_unit); if (r == 1) return std::make_pair(OptLengthQuantityT(length1), OptLengthQuantityT(length2)); if (r == 2) return std::make_pair(OptLengthQuantityT(length1), boost::none); if (r == 3) return std::make_pair(boost::none, OptLengthQuantityT(length2)); return std::make_pair(boost::none, boost::none); } } // namespace Quantities #ifdef TEST_QUANTITIES #include #include #include #include #include namespace Test_Quantities { /*----- test_XXX_quantity_parser ----------------------------------------*/ bool test_length_quantity_parser_ = test_length_quantity_parser(); bool test_dbl_length_quantity_parser_ = test_dbl_length_quantity_parser(); static bool test_length_quantity_parser() { using namespace Quantities; bool result = true; typedef boost::tuple tuple_t; std::vector< tuple_t > vec_ok; std::vector< std::string > vec_fail; vec_ok.push_back( boost::make_tuple("123", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123 ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123.5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123,5 ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123m", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 m", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 m ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123 m ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5m", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 m", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 m ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123.5 m ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5m", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 m", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 m ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123,5 m ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123meter", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 meter", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123 meter ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123 meter ", 123.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5meter", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 meter", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 meter ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123.5 meter ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5meter", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 meter", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 meter ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple(" 123,5 meter ", 123.5, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5cm", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5 cm", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5 cm ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123.5 cm ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123cm", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123 cm", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123 cm ", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123 cm ", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5cm", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5 cm", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5 cm ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123,5 cm ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5centimeter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5 centimeter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5 centimeter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123.5 centimeter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123centimeter", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123 centimeter", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123 centimeter ", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123 centimeter ", 1.23, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5centimeter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5 centimeter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5 centimeter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123,5 centimeter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5mm", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple(" 123.5 mm ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mm", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple(" 123,5 mm ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5millimeter", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 millimeter", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 millimeter ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple(" 123.5 millimeter ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5millimeter", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 millimeter", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 millimeter ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple(" 123,5 millimeter ", 0.1235, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5um", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 um", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 um ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123.5 um ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5um", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 um", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 um ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123,5 um ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5µm", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 µm", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 µm ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123.5 µm ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5µm", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 µm", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 µm ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123,5 µm ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5micrometer", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 micrometer", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5 micrometer ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123.5 micrometer ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5micrometer", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 micrometer", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123,5 micrometer ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple(" 123,5 micrometer ", 0.0001235, 1e-9) ); vec_ok.push_back( boost::make_tuple("123.5nm", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5 nm", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5 nm ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple(" 123.5 nm ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5nm", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5 nm", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5 nm ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple(" 123,5 nm ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5nanometer", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5 nanometer", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5 nanometer ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple(" 123.5 nanometer ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5nanometer", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5 nanometer", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123,5 nanometer ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple(" 123,5 nanometer ", 0.0000001235, 1e-12) ); vec_ok.push_back( boost::make_tuple("123.5Å", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5 Å", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5 Å ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple(" 123.5 Å ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5Å", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5 Å", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5 Å ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple(" 123,5 Å ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5angstrom", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5 angstrom", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5 angstrom ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple(" 123.5 angstrom ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5angstrom", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5 angstrom", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123,5 angstrom ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple(" 123,5 angstrom ", 0.00000001235, 1e-13) ); vec_ok.push_back( boost::make_tuple("123.5km", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5 km", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5 km ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple(" 123.5 km ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5km", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5 km", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5 km ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple(" 123,5 km ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5kilometer", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5 kilometer", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5 kilometer ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple(" 123.5 kilometer ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5kilometer", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5 kilometer", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123,5 kilometer ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple(" 123,5 kilometer ", 123500, 1e-0) ); vec_ok.push_back( boost::make_tuple("123.5e-2", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123e-2", 1.230, 1e-5) ); vec_ok.push_back( boost::make_tuple("123e-2 ", 1.230, 1e-5) ); vec_ok.push_back( boost::make_tuple("123e-2 ", 1.230, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123e-2 ", 1.230, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2m", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 m", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 m ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 m ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2m", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 m", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 m ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 m ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2meter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 meter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2 meter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 meter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2meter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 meter", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123,5e-2 meter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 meter ", 1.235, 1e-5) ); vec_ok.push_back( boost::make_tuple("123.5e-2cm", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2 cm", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2 cm ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 cm ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2cm", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2 cm", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2 cm ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 cm ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2centimeter", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2 centimeter", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2 centimeter ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 centimeter ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2centimeter", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2 centimeter", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123,5e-2 centimeter ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 centimeter ", 0.01235, 1e-7) ); vec_ok.push_back( boost::make_tuple("123.5e-2mm", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2 mm", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2 mm ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 mm ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2mm", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2 mm", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2 mm ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 mm ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2millimeter", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2 millimeter", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2 millimeter ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 millimeter ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2millimeter", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2 millimeter", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123,5e-2 millimeter ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 millimeter ", 0.001235, 1e-8) ); vec_ok.push_back( boost::make_tuple("123.5e-2nm", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2 nm", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2 nm ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 nm ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2nm", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2 nm", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2 nm ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 nm ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2nanometer", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2 nanometer", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2 nanometer ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 nanometer ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2nanometer", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2 nanometer", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123,5e-2 nanometer ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 nanometer ", 0.000000001235, 1e-14) ); vec_ok.push_back( boost::make_tuple("123.5e-2km", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5e-2 km", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5e-2 km ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 km ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2km", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2 km", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2 km ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 km ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5e-2kilometer", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5e-2 kilometer", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5e-2 kilometer ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple(" 123.5e-2 kilometer ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2kilometer", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2 kilometer", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123,5e-2 kilometer ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple(" 123,5e-2 kilometer ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5dam", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5 dam", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple("123.5 dam ", 1235.0, 1e-2) ); vec_ok.push_back( boost::make_tuple(" 123.5 dam ", 1235.0, 1e-2) ); vec_fail.push_back( "a123.5dam" ); vec_fail.push_back( "123.5da m" ); vec_fail.push_back( "123.5 da m" ); vec_fail.push_back( "123.5 dam s" ); vec_fail.push_back( "a 123.5 dam " ); vec_fail.push_back( "1 23.5 dam " ); vec_fail.push_back( "123.5 daM" ); vec_fail.push_back( "123.5 DAM" ); vec_fail.push_back( "123.5 da M" ); vec_fail.push_back( "123.5 DA M" ); vec_fail.push_back( "a123.5mm" ); vec_fail.push_back( "123.5m m" ); vec_fail.push_back( "123.5 m m" ); vec_fail.push_back( "123.5 mm s" ); vec_fail.push_back( "a 123.5 mm " ); vec_fail.push_back( "1 23.5 mm " ); vec_fail.push_back( "123.5 MM" ); vec_fail.push_back( "123.5 m M" ); vec_fail.push_back( "123.5 M M" ); vec_fail.push_back( "a123,5pm" ); vec_fail.push_back( "123,5p m" ); vec_fail.push_back( "123,5 p m" ); vec_fail.push_back( "123,5 pm s" ); vec_fail.push_back( "a 123,5 pm " ); vec_fail.push_back( "1 23,5 pm " ); vec_fail.push_back( "123,5 PM" ); vec_fail.push_back( "123,5 p M" ); vec_fail.push_back( "123,5 P M" ); std::ofstream stream("test_length_quantities.txt"); BOOST_FOREACH(const tuple_t& t, vec_ok) { OptLengthQuantityT ret = parse_length_quantity(t.get<0>()); bool test = ret && std::abs(ret->value() - t.get<1>()) < t.get<2>(); #ifdef TEST_ASSERT_ON_FAILURE assert(test); #endif if (test) { length_quantity_t v = length_quantity_t::from_value(ret->value()); stream << t.get<0>() << " == " << *ret << " == " << boost::units::engineering_prefix << *ret << " == " << boost::units::no_prefix << t.get<1>() << " == " << ret->value() << " == " << v << "--> ok" << std::endl; } else { result = false; stream << t.get<0>() << " --> failed" << std::endl; } } BOOST_FOREACH(const std::string& s, vec_fail) { OptLengthQuantityT ret = parse_length_quantity(s); #ifdef TEST_ASSERT_ON_FAILURE assert(!ret); #endif if (ret) { result = false; stream << s << " --> failed" << std::endl; } else { stream << s << " --> failed expected --> ok" << std::endl; } } return result; } static bool test_dbl_length_quantity_parser() { using namespace Quantities; bool result = true; typedef boost::tuple tuple_t; std::vector< tuple_t > vec_ok; std::vector< std::string > vec_fail, vec_ok_simple; vec_ok.push_back( boost::make_tuple("123 x 147", 123.0, 147.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123x147", 123.0, 147.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 x 147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5x147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 x 147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5x147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5mm x 147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mmx147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mm x 147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mmx147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm x 147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mmx147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm x 147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mmx147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 x 147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5x147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 x 147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5x147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5mm x 147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mmx147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mm x 147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mmx147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm x 147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mmx147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm x 147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mmx147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123 , 147", 123.0, 147.0, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 , 147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5,147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5 , 147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5,147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5mm , 147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mm,147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mm , 147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mm,147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm , 147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm,147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm , 147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm,147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 , 147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5,147.2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5 , 147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123.5,147,2", 123.5, 147.2, 1e-3) ); vec_ok.push_back( boost::make_tuple("123,5mm , 147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5mm,147.2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mm , 147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5mm,147,2mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm , 147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123,5 mm,147.2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm , 147,2 mm", 0.1235, 0.1472, 1e-6) ); vec_ok.push_back( boost::make_tuple("123.5 mm,147,2 mm", 0.1235, 0.1472, 1e-6) ); /* vec_ok_simple.push_back(" 123.5 a.u. x 156.7a.u."); vec_ok_simple.push_back(" 123.5 astronomical unit x 156.7astronomical unit"); vec_ok_simple.push_back(" 123.5 light year x 156.7 light second"); */ vec_ok_simple.push_back(" 123.5 µm x 156.7 µm"); vec_ok_simple.push_back(" 123.5 nm x 156.7mm"); vec_ok_simple.push_back(" 123.5 nmx156.7mm"); vec_ok_simple.push_back(" 123.5 nm , 156.7mm"); vec_ok_simple.push_back(" 123.5 nm, 156.7mm"); vec_ok_simple.push_back(" 123.5 nm ,156.7mm"); vec_ok_simple.push_back(" 123.5 nm,156.7mm"); vec_ok_simple.push_back(" 123.5 nm | 156.7mm"); vec_ok_simple.push_back(" 123.5 nm & 156.7mm"); vec_ok_simple.push_back(" 123.5 nm : 156.7mm"); vec_ok_simple.push_back(" 123,5 nm , 156.7mm"); vec_ok_simple.push_back(" 123,5 nm, 156.7mm"); vec_ok_simple.push_back(" 123,5 nm,156.7mm"); vec_ok_simple.push_back(" 123,5 nm ,156.7mm"); vec_ok_simple.push_back(" 123.5 nm , 156,7mm"); vec_ok_simple.push_back(" 123,5 nm , 156,7mm"); vec_ok_simple.push_back(" 123,5 nm, 156,7mm"); vec_ok_simple.push_back(" 123,5 nm,156,7mm"); vec_ok_simple.push_back(" 123,5 nm ,156,7mm"); vec_ok_simple.push_back(" 123.5e-3 nm x 156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nmx156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm , 156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm, 156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm ,156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm,156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm | 156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm & 156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm : 156.7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm , 156.7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm, 156.7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm,156.7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm ,156.7e-3mm"); vec_ok_simple.push_back(" 123.5e-3 nm , 156,7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm , 156,7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm, 156,7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm,156,7e-3mm"); vec_ok_simple.push_back(" 123,5e-3 nm ,156,7e-3mm"); vec_ok_simple.push_back(" 123.5 x 156.7mm"); vec_ok_simple.push_back(" 123.5 x156.7mm"); vec_ok_simple.push_back(" 123.5x156.7mm"); vec_ok_simple.push_back(" 123.5x 156.7mm"); vec_ok_simple.push_back(" 123 x 156"); vec_ok_simple.push_back(" 123 x156"); vec_ok_simple.push_back(" 123x156"); vec_ok_simple.push_back(" 123x 156"); vec_ok_simple.push_back(" 123,5 , 156,7mm"); vec_ok_simple.push_back(" 123,5 ,156,7mm"); vec_ok_simple.push_back(" 123,5, 156,7mm"); // vec_ok_simple.push_back(" 123.5e-3 exameter x 156.7e-3exameter"); vec_fail.push_back( "123,147" ); // vec_fail.push_back(" 123.5 exameter x 156.7exameter"); std::ofstream stream("test_dbl_length_quantities.txt"); BOOST_FOREACH(const tuple_t& t, vec_ok) { PairOptLengthQuantityT ret = parse_dbl_length_quantity(t.get<0>()); OptLengthQuantityT ret1 = ret.first; OptLengthQuantityT ret2 = ret.second; bool test = ret1 && ret2 && std::abs(ret1->value() - t.get<1>()) < t.get<3>() && std::abs(ret2->value() - t.get<2>()) < t.get<3>(); #ifdef TEST_ASSERT_ON_FAILURE assert(test); #endif if (test) { length_quantity_t v1 = length_quantity_t::from_value(ret1->value()); length_quantity_t v2 = length_quantity_t::from_value(ret2->value()); stream << t.get<0>() << " --> " << boost::units::engineering_prefix << *ret1 << " X " << *ret2 << boost::units::no_prefix << "--> ok" << std::endl; } else { result = false; stream << t.get<0>() << " --> failed" << std::endl; } } BOOST_FOREACH(const std::string& s, vec_ok_simple) { PairOptLengthQuantityT ret = parse_dbl_length_quantity(s); OptLengthQuantityT ret1 = ret.first; OptLengthQuantityT ret2 = ret.second; bool test = ret1 && ret2; #ifdef TEST_ASSERT_ON_FAILURE assert(test); #endif if (test) { result = false; stream << s << " --> " << boost::units::engineering_prefix << *ret1 << " X " << *ret2 << boost::units::no_prefix << " --> failed expected --> ok" << std::endl; } else { stream << s << " --> failed" << std::endl; } } BOOST_FOREACH(const std::string& s, vec_fail) { PairOptLengthQuantityT ret = parse_dbl_length_quantity(s); OptLengthQuantityT ret1 = ret.first; OptLengthQuantityT ret2 = ret.second; bool test = ret1 && ret2; #ifdef TEST_ASSERT_ON_FAILURE assert(!test); #endif if (test) { result = false; stream << s << " --> failed" << std::endl; } else { stream << s << " --> ok" << std::endl; } } return result; } } // namespace Test_Quantities #endif // TEST_QUANTITIES