You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2007/08/10 17:37:48 UTC

svn commit: r564621 - in /activemq/activemq-cpp/trunk/src/decaf/src: main/ main/decaf/internal/util/ main/decaf/lang/ test/ test/decaf/lang/

Author: tabish
Date: Fri Aug 10 08:37:42 2007
New Revision: 564621

URL: http://svn.apache.org/viewvc?view=rev&rev=564621
Log:
http://issues.apache.org/activemq/browse/AMQCPP-103

Implementing the Primitive Wrappers fully

Modified:
    activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.h
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Float.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.h
    activemq/activemq-cpp/trunk/src/decaf/src/test/testRegistry.cpp

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/Makefile.am Fri Aug 10 08:37:42 2007
@@ -58,6 +58,7 @@
    decaf/util/Config.cpp \
    decaf/internal/util/BigInt.cpp \
    decaf/internal/util/BitOps.cpp \
+   decaf/internal/util/NumberConverter.cpp \
    decaf/internal/util/FloatingPointParser.cpp \
    decaf/internal/util/HexStringParser.cpp
 
@@ -149,6 +150,7 @@
    decaf/util/logging/LogWriter.h \
    decaf/util/logging/SimpleLogger.h \
    decaf/util/logging/PropertiesChangeListener.h \
+   decaf/internal/util/NumberConverter.h \
    decaf/internal/util/FloatingPointParser.h \
    decaf/internal/util/HexStringParser.h \
    decaf/internal/util/BitOps.h \

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp Fri Aug 10 08:37:42 2007
@@ -18,6 +18,12 @@
 #include "NumberConverter.h"
 
 #include <decaf/lang/Math.h>
+#include <decaf/lang/Float.h>
+#include <decaf/lang/Double.h>
+#include <decaf/lang/Integer.h>
+
+#include <decaf/internal/util/BigInt.h>
+#include <decaf/internal/util/BitOps.h>
 
 using namespace decaf;
 using namespace decaf::lang;
@@ -28,6 +34,7 @@
 const double NumberConverter::invLogOfTenBaseTwo =
     Math::log(2.0) / Math::log(10.0);
 NumberConverter::StaticInitializer NumberConverter::init;
+std::vector<long long> NumberConverter::TEN_TO_THE;
 
 ////////////////////////////////////////////////////////////////////////////////
 NumberConverter::StaticInitializer::StaticInitializer() {
@@ -35,7 +42,7 @@
     NumberConverter::TEN_TO_THE.resize(20);
     NumberConverter::TEN_TO_THE[0] = 1L;
 
-    for( int i = 1; i < TEN_TO_THE.length; ++i ) {
+    for( std::size_t i = 1; i < TEN_TO_THE.size(); ++i ) {
         long long previous = TEN_TO_THE[i - 1];
         TEN_TO_THE[i] = ( previous << 1 ) + ( previous << 3 );
     }
@@ -56,13 +63,13 @@
     unsigned int p = 1023 + 52; // the power offset (precision)
 
     // the mask to get the sign of the number
-    unsigned long long signMask = 0x8000000000000000L;
+    unsigned long long signMask = 0x8000000000000000ULL;
     // the mask to get the power bits
-    unsigned long long eMask = 0x7FF0000000000000L;
+    unsigned long long eMask = 0x7FF0000000000000ULL;
     // the mask to get the significand bits
-    unsigned long long fMask = 0x000FFFFFFFFFFFFFL;
+    unsigned long long fMask = 0x000FFFFFFFFFFFFFULL;
 
-    unsigned long long inputNumberBits = Double::doubleToLongBits(value);
+    unsigned long long inputNumberBits = Double::doubleToLongBits( value );
     // the value of the sign... 0 is positive, ~0 is negative
     std::string signString = ( inputNumberBits & signMask ) == 0 ? "" : "-";
     // the value of the 'power bits' of the value
@@ -70,7 +77,7 @@
     // the value of the 'significand bits' of the value
     unsigned long long f = inputNumberBits & fMask;
     bool mantissaIsZero = (f == 0);
-    unsigned int pow = 0, numBits = 52;
+    int pow = 0, numBits = 52;
 
     if( e == 2047 ) {
         return mantissaIsZero ? signString + "Infinity" : "NaN";
@@ -90,14 +97,14 @@
 
         pow = 1 - p; // a denormalized number
         long long ff = f;
-        while( (ff & 0x0010000000000000L) == 0 ) {
+        while( (ff & 0x0010000000000000ULL ) == 0 ) {
             ff = ff << 1;
             numBits--;
         }
     } else {
         // 0 < e < 2047
         // a "normalized" number
-        f = f | 0x0010000000000000L;
+        f = f | 0x0010000000000000ULL;
         pow = e - p;
     }
 
@@ -107,8 +114,8 @@
         bigIntDigitGeneratorInstImpl( f, pow, e == 0, mantissaIsZero, numBits );
     }
 
-    if( value >= 1e7D || value <= -1e7D ||
-        ( value > -1e-3D && value < 1e-3D ) ) {
+    if( value >= 1e7 || value <= -1e7 ||
+        ( value > -1e-3 && value < 1e-3 ) ) {
         return signString + freeFormatExponential();
     }
 
@@ -131,7 +138,7 @@
     // the value of the 'significand bits' of the value
     unsigned int f = inputNumberBits & fMask;
     bool mantissaIsZero = ( f == 0 );
-    unsigned int pow = 0, numBits = 23;
+    int pow = 0, numBits = 23;
 
     if( e == 255 ) {
         return mantissaIsZero ? signString + "Infinity" : "NaN";
@@ -178,7 +185,7 @@
 std::string NumberConverter::freeFormatExponential() {
 
     // corresponds to process "Free-Format Exponential"
-    char[25] formattedDecimal = {0};
+    char formattedDecimal[25] = {0};
     formattedDecimal[0] = (char)( '0' + uArray[getCount++] );
     formattedDecimal[1] = '.';
     // the position the next character is to be inserted into
@@ -208,7 +215,7 @@
 std::string NumberConverter::freeFormat() {
 
     // corresponds to process "Free-Format"
-    char[25] formattedDecimal = {0};
+    char formattedDecimal[25] = {0};
     // the position the next character is to be inserted into
     // formattedDecimal
     int charPos = 0;
@@ -246,8 +253,8 @@
 void NumberConverter::bigIntDigitGeneratorInstImpl(
     long long f, int e, bool isDenormalized, bool mantissaIsZero, int p ) {
 
-    static std::size_t RM_SIZE 21;
-    static std::size_t STemp_SIZE 22;
+    static const std::size_t RM_SIZE = 21;
+    static const std::size_t STemp_SIZE = 22;
 
     unsigned int RLength, SLength, TempLength, mplus_Length, mminus_Length;
     int high, low, i;
@@ -263,11 +270,11 @@
 
         *R = f;
         *mplus = *mminus = 1;
-        simpleShiftLeftHighPrecision( mminus, RM_SIZE, e );
+        BigInt::simpleShiftLeftHighPrecision( mminus, RM_SIZE, e );
 
         if( f != (2 << (p - 1)) ) {
 
-            simpleShiftLeftHighPrecision( R, RM_SIZE, e + 1 );
+            BigInt::simpleShiftLeftHighPrecision( R, RM_SIZE, e + 1 );
             *S = 2;
 
             /*
@@ -278,13 +285,13 @@
              *      470fffffffffffff = 2.0769187434139308E34
              *      4710000000000000 = 2.076918743413931E34
              */
-            simpleShiftLeftHighPrecision(mplus, RM_SIZE, e);
+            BigInt::simpleShiftLeftHighPrecision(mplus, RM_SIZE, e);
 
         } else {
 
-            simpleShiftLeftHighPrecision( R, RM_SIZE, e + 2 );
+            BigInt::simpleShiftLeftHighPrecision( R, RM_SIZE, e + 2 );
             *S = 4;
-            simpleShiftLeftHighPrecision( mplus, RM_SIZE, e + 1 );
+            BigInt::simpleShiftLeftHighPrecision( mplus, RM_SIZE, e + 1 );
         }
 
     } else {
@@ -293,34 +300,34 @@
 
             *R = f << 1;
             *S = 1;
-            simpleShiftLeftHighPrecision( S, STemp_SIZE, 1 - e );
+            BigInt::simpleShiftLeftHighPrecision( S, STemp_SIZE, 1 - e );
             *mplus = *mminus = 1;
 
         } else {
 
             *R = f << 2;
             *S = 1;
-            simpleShiftLeftHighPrecision( S, STemp_SIZE, 2 - e );
+            BigInt::simpleShiftLeftHighPrecision( S, STemp_SIZE, 2 - e );
             *mplus = 2;
             *mminus = 1;
         }
     }
 
-    k = (int) ceil ((e + p - 1) * INV_LOG_OF_TEN_BASE_2 - 1e-10);
+    k = (int)Math::ceil( (e + p - 1) * invLogOfTenBaseTwo - 1e-10 );
 
     if( k > 0 ) {
-        timesTenToTheEHighPrecision( S, STemp_SIZE, k );
+        BigInt::timesTenToTheEHighPrecision( S, STemp_SIZE, k );
     } else {
-      timesTenToTheEHighPrecision( R, RM_SIZE, -k );
-      timesTenToTheEHighPrecision( mplus, RM_SIZE, -k );
-      timesTenToTheEHighPrecision( mminus, RM_SIZE, -k );
+        BigInt::timesTenToTheEHighPrecision( R, RM_SIZE, -k );
+        BigInt::timesTenToTheEHighPrecision( mplus, RM_SIZE, -k );
+        BigInt::timesTenToTheEHighPrecision( mminus, RM_SIZE, -k );
     }
 
     RLength = mplus_Length = mminus_Length = RM_SIZE;
     SLength = TempLength = STemp_SIZE;
 
-    memset( Temp + RM_SIZE, 0, (STemp_SIZE - RM_SIZE) * sizeof (U_64) );
-    memcpy( Temp, R, RM_SIZE * sizeof (U_64) );
+    memset( Temp + RM_SIZE, 0, (STemp_SIZE - RM_SIZE) * sizeof (unsigned long long) );
+    memcpy( Temp, R, RM_SIZE * sizeof (unsigned long long) );
 
     while( RLength > 1 && R[RLength - 1] == 0 ) {
         --RLength;
@@ -336,16 +343,16 @@
     }
 
     TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
-    addHighPrecision( Temp, TempLength, mplus, mplus_Length );
+    BigInt::addHighPrecision( Temp, TempLength, mplus, mplus_Length );
 
-    if( compareHighPrecision (Temp, TempLength, S, SLength) >= 0 ) {
+    if( BigInt::compareHighPrecision (Temp, TempLength, S, SLength) >= 0 ) {
         firstK = k;
     } else {
 
         firstK = k - 1;
-        simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
-        simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
-        simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
         while( RLength > 1 && R[RLength - 1] == 0 ) {
             --RLength;
         }
@@ -364,30 +371,30 @@
         for( i = 3; i >= 0; --i ) {
             TempLength = SLength + 1;
             Temp[SLength] = 0;
-            memcpy (Temp, S, SLength * sizeof (U_64));
-            simpleShiftLeftHighPrecision( Temp, TempLength, i );
-            if( compareHighPrecision( R, RLength, Temp, TempLength ) >= 0 ) {
-                subtractHighPrecision( R, RLength, Temp, TempLength );
+            memcpy( Temp, S, SLength * sizeof(unsigned long long) );
+            BigInt::simpleShiftLeftHighPrecision( Temp, TempLength, i );
+            if( BigInt::compareHighPrecision( R, RLength, Temp, TempLength ) >= 0 ) {
+                BigInt::subtractHighPrecision( R, RLength, Temp, TempLength );
                 U += 1 << i;
             }
         }
 
-        low = compareHighPrecision( R, RLength, mminus, mminus_Length ) <= 0;
+        low = BigInt::compareHighPrecision( R, RLength, mminus, mminus_Length ) <= 0;
 
-        memset( Temp + RLength, 0, (STemp_SIZE - RLength) * sizeof(U_64) );
-        memcpy( Temp, R, RLength * sizeof(U_64) );
+        memset( Temp + RLength, 0, (STemp_SIZE - RLength) * sizeof(unsigned long long) );
+        memcpy( Temp, R, RLength * sizeof(unsigned long long) );
         TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
-        addHighPrecision( Temp, TempLength, mplus, mplus_Length );
+        BigInt::addHighPrecision( Temp, TempLength, mplus, mplus_Length );
 
-        high = compareHighPrecision( Temp, TempLength, S, SLength ) >= 0;
+        high = BigInt::compareHighPrecision( Temp, TempLength, S, SLength ) >= 0;
 
         if( low || high ) {
             break;
         }
 
-        simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
-        simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
-        simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
+        BigInt::simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
         while( RLength > 1 && R[RLength - 1] == 0 ) {
             --RLength;
         }
@@ -401,13 +408,13 @@
     }
     while( true );
 
-    simpleShiftLeftHighPrecision( R, ++RLength, 1 );
+    BigInt::simpleShiftLeftHighPrecision( R, ++RLength, 1 );
 
     if( low && !high ) {
         uArray[setCount++] = U;
     } else if( high && !low ) {
         uArray[setCount++] = U + 1;
-    } else if( compareHighPrecision( R, RLength, S, SLength) < 0 ) {
+    } else if( BigInt::compareHighPrecision( R, RLength, S, SLength) < 0 ) {
         uArray[setCount++] = U;
     } else {
         uArray[setCount++] = U + 1;
@@ -461,7 +468,7 @@
     getCount = setCount = 0; // reset indices
     bool low, high;
     int U;
-    long long[] Si = new long long[] { S, S << 1, S << 2, S << 3 };
+    long long Si[4] = { S, S << 1, S << 2, S << 3 };
     while( true ) {
         // set U to be floor (R / S) and R to be the remainder
         // using a kind of "binary search" to find the answer.

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.h?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.h (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/NumberConverter.h Fri Aug 10 08:37:42 2007
@@ -18,6 +18,10 @@
 #ifndef _DECAF_INTERNAL_UTIL_NUMBERCONVERTER_H_
 #define _DECAF_INTERNAL_UTIL_NUMBERCONVERTER_H_
 
+#include <decaf/util/Config.h>
+#include <vector>
+#include <string>
+
 namespace decaf{
 namespace internal{
 namespace util{
@@ -81,9 +85,9 @@
         std::string freeFormat();
 
         void bigIntDigitGeneratorInstImpl(
-            long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
+            long long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
         void longDigitGenerator(
-            long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
+            long long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
 
     };
 

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Float.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Float.cpp?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Float.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Float.cpp Fri Aug 10 08:37:42 2007
@@ -17,6 +17,8 @@
 
 #include "Float.h"
 #include <decaf/lang/Integer.h>
+#include <decaf/internal/util/FloatingPointParser.h>
+#include <decaf/internal/util/NumberConverter.h>
 
 using namespace std;
 using namespace decaf;
@@ -146,7 +148,7 @@
 float Float::parseFloat( const std::string& value )
     throw ( exceptions::NumberFormatException ) {
 
-    return 0.0; // TODO
+    return internal::util::FloatingPointParser::parseFloat( value );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -235,7 +237,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 std::string Float::toString( float value ) {
-    return ""; //TODO
+    return internal::util::NumberConverter::convert( value );
 }
 
 ////////////////////////////////////////////////////////////////////////////////

Modified: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.cpp?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.cpp Fri Aug 10 08:37:42 2007
@@ -29,5 +29,15 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test() {
+void FloatTest::test_ConstructorF() {
+    // Test for method decaf.lang.Float(float)
+    Float f( 900.89f );
+    CPPUNIT_ASSERT_MESSAGE( "Created incorrect float", f.floatValue() == 900.89f );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void FloatTest::test_ConstructorString() {
+    // Test for method decaf.lang.Float(decaf.lang.String)
+    Float f( "900.89" );
+    CPPUNIT_ASSERT_MESSAGE("Created incorrect Float", f.floatValue() == 900.89f);
 }

Modified: activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.h?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.h (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/decaf/lang/FloatTest.h Fri Aug 10 08:37:42 2007
@@ -27,7 +27,8 @@
     class FloatTest : public CppUnit::TestFixture
     {
         CPPUNIT_TEST_SUITE( FloatTest );
-        CPPUNIT_TEST( test );
+        CPPUNIT_TEST( test_ConstructorF );
+        CPPUNIT_TEST( test_ConstructorString );
         CPPUNIT_TEST_SUITE_END();
 
     public:
@@ -35,7 +36,8 @@
         FloatTest();
         virtual ~FloatTest() {}
 
-        virtual void test();
+        void test_ConstructorF();
+        void test_ConstructorString();
 
     };
 

Modified: activemq/activemq-cpp/trunk/src/decaf/src/test/testRegistry.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/test/testRegistry.cpp?view=diff&rev=564621&r1=564620&r2=564621
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/test/testRegistry.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/test/testRegistry.cpp Fri Aug 10 08:37:42 2007
@@ -31,8 +31,8 @@
 //#include <decaf/io/DataOutputStreamTest.h>
 //CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::DataOutputStreamTest );
 
-#include <decaf/lang/MathTest.h>
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::MathTest );
+//#include <decaf/lang/MathTest.h>
+//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::MathTest );
 //#include <decaf/lang/ByteTest.h>
 //CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ByteTest );
 //#include <decaf/lang/CharacterTest.h>
@@ -45,10 +45,10 @@
 //CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::IntegerTest );
 //#include <decaf/lang/LongTest.h>
 //CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::LongTest );
-//#include <decaf/lang/FloatTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::FloatTest );
-//#include <decaf/lang/DoubleTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::DoubleTest );
+#include <decaf/lang/FloatTest.h>
+CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::FloatTest );
+#include <decaf/lang/DoubleTest.h>
+CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::DoubleTest );
 //#include <decaf/lang/ExceptionTest.h>
 //CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ExceptionTest );
 //#include <decaf/lang/ThreadTest.h>