diff options
author | valmat <ufabiz@gmail.com> | 2014-03-27 22:44:38 +0600 |
---|---|---|
committer | valmat <ufabiz@gmail.com> | 2014-03-27 22:44:38 +0600 |
commit | 465f4b7b72a17102e91f05f5d36d024b73e3787c (patch) | |
tree | cb848df412fdf544dd2f96232ab5eefb83927814 /tests/cpp | |
parent | c0e1f20eeab6445d6355ea11ef7d264cb37c52cf (diff) |
Fix test value-casting-operators
Diffstat (limited to 'tests/cpp')
-rw-r--r-- | tests/cpp/include/doubl2str.h | 102 | ||||
-rw-r--r-- | tests/cpp/include/variables.h | 36 | ||||
-rw-r--r-- | tests/cpp/main.cpp | 5 |
3 files changed, 132 insertions, 11 deletions
diff --git a/tests/cpp/include/doubl2str.h b/tests/cpp/include/doubl2str.h new file mode 100644 index 0000000..1a5e3fc --- /dev/null +++ b/tests/cpp/include/doubl2str.h @@ -0,0 +1,102 @@ +/** + * + * double -> string + * + */ + + + +char num2char(unsigned int num) +{ + switch(num) + { + case 0: + return '0'; + case 1: + return '1'; + case 2: + return '2'; + case 3: + return '3'; + case 4: + return '4'; + case 5: + return '5'; + case 6: + return '6'; + case 7: + return '7'; + case 8: + return '8'; + case 9: + return '9'; + } + + //return '\0'; + return '-'; +} + +std::string double2str(long double D) +{ + int sign = (D > 0) ? 1 : (D*=-1.0, -1); + unsigned long long int Ceil = D; + + // if D is ceil + if(Ceil == D) + { + return std::to_string( (long long)(D*sign) ); + } + + // size of result buffer + const int bs = 32; + + // size of temporary buffer + const int pw = 16; + // Temporary buffer + char buf[pw]; + // Result buffer + char rez[bs]; + + int i, size = 0; + // set sign + if(sign < 0) rez[size++] = '-'; + + // set ceil + std::string sceil = std::to_string(Ceil); + const char * bceil = sceil.c_str(); + int sceillen = sceil.size(); + for(i = 0; i < sceillen; i++) + { + rez[size++] = bceil[i]; + } + + // set point + rez[size++] = '.'; + + unsigned long long int I = D * 10000000000000000; // D * 10**pw + // .14159265359 -> 14159265359000000 + I -= Ceil * 10000000000000000; + + // Remove the tail of zeros + // 14159265359000000 -> 14159265359 + while(0 == I % 10) I /= 10; + + int ind = 0; + while(I > 0) + { + buf[ind++] = num2char(I%10); + I = (I - I%10) / 10; + } + + // set fraction part + for(i = 0; i < ind; i++) + { + rez[size] = buf[ind-i-1]; + size++; + } + + return std::string(rez, size); + //rez[size] = '\0'; +} + + diff --git a/tests/cpp/include/variables.h b/tests/cpp/include/variables.h index f242653..b7063ef 100644 --- a/tests/cpp/include/variables.h +++ b/tests/cpp/include/variables.h @@ -4,6 +4,8 @@ * */ + #include "doubl2str.h" + /** * Set up namespace */ @@ -120,20 +122,36 @@ namespace TestVariables { return r; } + /* - * Test Php::Value casting operators - */ + * Test Php::Value casting operators + */ void value_casting(Php::Parameters ¶ms) { - Php::Value value = params[0]; + Php::Value value = params[0]; - long value1 = value; - std::string value2 = value; - //long double value3 = value; // <------------ error: conversion from ‘Php::Value’ to ‘long double’ is ambiguous - double value3 = value; - bool value4 = value; + long value1 = value; + std::string value2 = value; + bool value4 = value; - Php::out << " long:" << value1 << "\n string:" << value2 << "\n double:" << value3 << "\n bool:" << bool2str(value4) << std::endl; + Php::out << " long:" << value1 << "\n string:" << value2 << "\n bool:" << bool2str(value4) << std::endl; + } + + + /* + * Test Php::Value casting operators + */ + void value_cast2double(Php::Parameters ¶ms) + { + Php::Value value = params[0]; + double value3 = value; + + /* + * The remark (from valmat). + * Somehow std::to_string truncates the tail of numbers of type `double` when converting it to a string. + * So I wrote my own function `double2str()`, which does not have this drawback. + */ + Php::out << double2str(value3) << std::endl; } /* diff --git a/tests/cpp/main.cpp b/tests/cpp/main.cpp index 2928f60..6b1502b 100644 --- a/tests/cpp/main.cpp +++ b/tests/cpp/main.cpp @@ -63,11 +63,12 @@ extern "C" extension.add("TestVariables\\value_types", TestVariables::value_types); extension.add("TestVariables\\scalar_store", TestVariables::scalar_store); extension.add("TestVariables\\value_casting", TestVariables::value_casting); + extension.add("TestVariables\\value_cast2double", TestVariables::value_cast2double); extension.add("TestVariables\\value_cast2str", TestVariables::value_cast2str); extension.add("TestVariables\\overloaded_op", TestVariables::overloaded_op); extension.add("TestVariables\\value_arrays", TestVariables::value_arrays); - extension.add("TestVariables\\value_object1", TestVariables::value_object1); - extension.add("TestVariables\\value_object2", TestVariables::value_object2); + extension.add("TestVariables\\value_object1", TestVariables::value_object1); + extension.add("TestVariables\\value_object2", TestVariables::value_object2); |