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/09 17:23:53 UTC

svn commit: r564238 - in /activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util: FloatingPointParser.cpp HexStringParser.cpp HexStringParser.h

Author: tabish
Date: Thu Aug  9 08:23:52 2007
New Revision: 564238

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

Implementing the Primitive Wrappers fully

Modified:
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.h

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp?view=diff&rev=564238&r1=564237&r2=564238
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp Thu Aug  9 08:23:52 2007
@@ -25,6 +25,7 @@
 #include <decaf/internal/util/HexStringParser.h>
 #include <decaf/internal/util/BigInt.h>
 #include <decaf/internal/util/BitOps.h>
+#include <decaf/lang/exceptions/NumberFormatException.h>
 #include <apr_lib.h>
 
 using namespace std;
@@ -141,6 +142,17 @@
 ////////////////////////////////////////////////////////////////////////////////
 float FloatingPointParser::parseFltImpl( const std::string& value, int exp )
     throw ( exceptions::NumberFormatException ) {
+
+    float flt = (float)exp; // TODO - FloatOps::createFloat( str, exp );
+
+    if( Float::floatToIntBits( flt ) >= 0 ) {
+        return flt;
+    } else if( Float::floatToIntBits( flt ) == -1 ) {
+      throw exceptions::NumberFormatException(
+          __FILE__, __LINE__,
+          "FloatingPointParser::parseFltImpl - Not a valid float string",
+          value.c_str() );
+    }
 
     return 0.0f;
 }

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp?view=diff&rev=564238&r1=564237&r2=564238
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp Thu Aug  9 08:23:52 2007
@@ -22,9 +22,11 @@
 #include <decaf/lang/Long.h>
 #include <decaf/lang/Double.h>
 #include <decaf/lang/Float.h>
+#include <decaf/util/StringTokenizer.h>
 #include <decaf/lang/exceptions/NumberFormatException.h>
 
 using namespace decaf;
+using namespace decaf::util;
 using namespace decaf::lang;
 using namespace decaf::lang::exceptions;
 using namespace decaf::internal;
@@ -130,10 +132,13 @@
 ////////////////////////////////////////////////////////////////////////////////
 void HexStringParser::parseMantissa(const std::string& significantStr) {
 
-    //TODO
-    std::string* strings = significantStr.split("\\.");
+    StringTokenizer tokenizer( significantStr, "\\." );
+    std::vector<std::string> strings;
+
+    tokenizer.toArray( strings );
+
     std::string strIntegerPart = strings[0];
-    std::string strDecimalPart = strings.length > 1 ? strings[1] : "";
+    std::string strDecimalPart = strings.size() > 1 ? strings[1] : "";
 
     std::string significand =
         getNormalizedSignificand( strIntegerPart, strDecimalPart) ;
@@ -222,13 +227,11 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-/*
- * The value is rounded up or down to the nearest infinitely precise result.
- * If the value is exactly halfway between two infinitely precise results,
- * then it should be rounded up to the nearest infinitely precise even.
- */
 void HexStringParser::round() {
-    std::string result = abandonedNumber.replaceAll( "0+", "" );
+
+    std::string result = abandonedNumber;
+    replaceAll( result, "0+", "" );
+
     bool moreThanZero = ( result.length() > 0 ? true : false );
 
     int lastDiscardedBit = (int)( mantissa & 1L );
@@ -257,7 +260,7 @@
     replaceFirst( significand, "^0x", "" );
 
     if( significand.length() == 0 ) {
-        significand = "0"; //$NON-NLS-1$
+        significand = "0";
     }
     return significand;
 }

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.h?view=diff&rev=564238&r1=564237&r2=564238
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.h (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/internal/util/HexStringParser.h Thu Aug  9 08:23:52 2007
@@ -187,6 +187,19 @@
                 return target.replace( pos, find.length(), replace );
             }
         }
+
+        // TODO
+        std::string& replaceAll( std::string& target,
+                                 const std::string& find,
+                                 const std::string& replace ) {
+
+            std::string::size_type pos = std::string::npos;
+
+            if( ( pos = target.find_first_of( find, 0 ) ) != std::string::npos ) {
+                return target.replace( pos, find.length(), replace );
+            }
+        }
+
     };
 
 }}}