You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2005/09/19 02:30:01 UTC
svn commit: r290030 - in /incubator/stdcxx/trunk/tests: include/valcmp.h
src/valcmp.cpp
Author: sebor
Date: Sun Sep 18 17:29:57 2005
New Revision: 290030
URL: http://svn.apache.org/viewcvs?rev=290030&view=rev
Log:
2005-09-18 Martin Sebor <se...@roguewave.com>
* valcmp.h (rw_equal): New function template and overloads thereof
for the three floating point types.
* valcmp.cpp: Renamed file scope statics according to the naming
convention for such things (i.e., _rw_xxx).
Modified:
incubator/stdcxx/trunk/tests/include/valcmp.h
incubator/stdcxx/trunk/tests/src/valcmp.cpp
Modified: incubator/stdcxx/trunk/tests/include/valcmp.h
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/include/valcmp.h?rev=290030&r1=290029&r2=290030&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/include/valcmp.h (original)
+++ incubator/stdcxx/trunk/tests/include/valcmp.h Sun Sep 18 17:29:57 2005
@@ -28,6 +28,7 @@
#define CMP_NULTERM 1 /* the first 0 terminates processing */
#define CMP_RETOFF 2 /* return offset of the first mismatch */
#define CMP_NOCASE 4 /* case-insensitive character comparison */
+#define CMP_FP 8 /* safe floating pointing comparison */
_TEST_EXPORT int
@@ -59,6 +60,8 @@
}
+/**************************************************************************/
+
_TEST_EXPORT int
rw_strncmp (const char*, const char*,
_RWSTD_SIZE_T = _RWSTD_SIZE_MAX, int = CMP_NULTERM);
@@ -79,6 +82,7 @@
#endif // _RWSTD_NO_WCHAR_T
+
/**
* Compares two floating point numbers for equality.
*
@@ -87,9 +91,9 @@
*
* @return Returns a negative value, 0, or a positive value, depending
* on whether the first number is less than, equal to, or greater
- * than the second array. The magnitude of the returned value
- * represents the number of distinct values representable in
- * the type between the two arguments.
+ * than the second number. The magnitude of the returned value
+ * indicates the number of distinct values representable in
+ * the type of the number between the two arguments.
*/
_TEST_EXPORT int
rw_fltcmp (float x, float y);
@@ -111,5 +115,48 @@
#endif // _RWSTD_NO_LONG_DOUBLE
+/**************************************************************************/
+
+/**
+ * Compares two values of the same type for equality.
+ *
+ * @param x The left hand side of the comparison.
+ * @param y The right hand side of the comparison.
+ *
+ * @return Returns 1 if the the values are the same, 0 otherwise.
+ */
+template <class T>
+inline int rw_equal (T x, T y)
+{
+ return x == y;
+}
+
+/**
+ * @see rw_equal.
+ */
+inline int rw_equal (float x, float y)
+{
+ return 0 == rw_fltcmp (x, y);
+}
+
+/**
+ * @see rw_equal.
+ */
+inline int rw_equal (double x, double y)
+{
+ return 0 == rw_dblcmp (x, y);
+}
+
+#ifndef _RWSTD_NO_LONG_DOUBLE
+
+/**
+ * @see rw_equal.
+ */
+inline int rw_equal (long double x, long double y)
+{
+ return 0 == rw_ldblcmp (x, y);
+}
+
+#endif // _RWSTD_NO_LONG_DOUBLE
#endif // RW_VALCMP_H_INCLUDED
Modified: incubator/stdcxx/trunk/tests/src/valcmp.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/src/valcmp.cpp?rev=290030&r1=290029&r2=290030&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/src/valcmp.cpp (original)
+++ incubator/stdcxx/trunk/tests/src/valcmp.cpp Sun Sep 18 17:29:57 2005
@@ -28,12 +28,13 @@
#include <stdlib.h> // for abort
#include <string.h> // for memcmp
+/**************************************************************************/
typedef unsigned char UChar;
static const UChar
-rw_upper [] = {
+_rw_upper [] = {
#if 'A' == 0x41
@@ -114,7 +115,7 @@
// returns 1 iff all size bytes of the object pointed to by buf are 0
static int
-rw_iszero (const void *buf, _RWSTD_SIZE_T size)
+_rw_iszero (const void *buf, _RWSTD_SIZE_T size)
{
for (_RWSTD_SIZE_T i = 0; i != size; ++i)
if (_RWSTD_STATIC_CAST (const UChar*, buf)[i])
@@ -126,16 +127,16 @@
// compares two objects of equal size
static int
-rw_cmpx (const void *buf1,
- const void *buf2,
- _RWSTD_SIZE_T nelems,
- _RWSTD_SIZE_T size,
- int flags = 0)
+_rw_cmpx (const void *buf1,
+ const void *buf2,
+ _RWSTD_SIZE_T nelems,
+ _RWSTD_SIZE_T size,
+ int flags = 0)
{
const UChar *p1 = _RWSTD_STATIC_CAST (const UChar*, buf1);
const UChar *p2 = _RWSTD_STATIC_CAST (const UChar*, buf2);
- int ret;
+ int ret = 0;
for ( ; nelems; p1 += size, p2 += size, --nelems) {
@@ -143,8 +144,8 @@
if (flags & CMP_NULTERM) {
- const int zero1 = rw_iszero (p1, size);
- const int zero2 = rw_iszero (p2, size);
+ const int zero1 = _rw_iszero (p1, size);
+ const int zero2 = _rw_iszero (p2, size);
if (zero1 || zero2) {
ret = zero1 - zero2;
@@ -175,10 +176,10 @@
// compares two byte arrays
static int
-rw_cmp1 (const void *buf1,
- const void *buf2,
- _RWSTD_SIZE_T nelems,
- int flags = 0)
+_rw_cmp1 (const void *buf1,
+ const void *buf2,
+ _RWSTD_SIZE_T nelems,
+ int flags = 0)
{
#ifdef _RWSTD_UINT8_T
@@ -223,8 +224,8 @@
if (ui1 != ui2) {
if (flags & CMP_NOCASE) {
- if (rw_upper [ui1] != rw_upper [ui2]) {
- ret = rw_upper [ui1] < rw_upper [ui2] ? -1 : +1;
+ if (_rw_upper [ui1] != _rw_upper [ui2]) {
+ ret = _rw_upper [ui1] < _rw_upper [ui2] ? -1 : +1;
break;
}
}
@@ -250,10 +251,10 @@
// compares two arrays of objects each 16 bits in size
static int
-rw_cmp2 (const void *buf1,
- const void *buf2,
- _RWSTD_SIZE_T nelems,
- int flags = 0)
+_rw_cmp2 (const void *buf1,
+ const void *buf2,
+ _RWSTD_SIZE_T nelems,
+ int flags = 0)
{
#ifdef _RWSTD_UINT16_T
@@ -289,8 +290,8 @@
ret = ui1 < ui2 ? -1 : +1;
break;
}
- else if (rw_upper [ui1] != rw_upper [ui2]) {
- ret = rw_upper [ui1] < rw_upper [ui2] ? -1 : +1;
+ else if (_rw_upper [ui1] != _rw_upper [ui2]) {
+ ret = _rw_upper [ui1] < _rw_upper [ui2] ? -1 : +1;
break;
}
}
@@ -309,7 +310,7 @@
#else // if !defined (_RWSTD_UINT16_T)
- return rw_cmpx (buf1, buf2, nelems, 2, flags);
+ return _rw_cmpx (buf1, buf2, nelems, 2, flags);
#endif // _RWSTD_UINT16_T
}
@@ -317,10 +318,10 @@
// compares two arrays of objects each 32 bits in size
static int
-rw_cmp4 (const void *buf1,
- const void *buf2,
- _RWSTD_SIZE_T nelems,
- int flags = 0)
+_rw_cmp4 (const void *buf1,
+ const void *buf2,
+ _RWSTD_SIZE_T nelems,
+ int flags = 0)
{
#ifdef _RWSTD_UINT32_T
@@ -356,8 +357,8 @@
ret = ui1 < ui2 ? -1 : +1;
break;
}
- else if (rw_upper [ui1] != rw_upper [ui2]) {
- ret = rw_upper [ui1] < rw_upper [ui2] ? -1 : +1;
+ else if (_rw_upper [ui1] != _rw_upper [ui2]) {
+ ret = _rw_upper [ui1] < _rw_upper [ui2] ? -1 : +1;
break;
}
}
@@ -376,7 +377,7 @@
#else // if !defined (_RWSTD_UINT32_T)
- return rw_cmpx (buf1, buf2, nelems, 4, flags);
+ return _rw_cmpx (buf1, buf2, nelems, 4, flags);
#endif // _RWSTD_UINT32_T
}
@@ -384,10 +385,10 @@
// compares two arrays of objects each 64 bits in size
static int
-rw_cmp8 (const void *buf1,
- const void *buf2,
- _RWSTD_SIZE_T nelems,
- int flags = 0)
+_rw_cmp8 (const void *buf1,
+ const void *buf2,
+ _RWSTD_SIZE_T nelems,
+ int flags = 0)
{
#ifdef _RWSTD_UINT64_T
@@ -423,8 +424,8 @@
ret = ui1 < ui2 ? -1 : +1;
break;
}
- else if (rw_upper [ui1] != rw_upper [ui2]) {
- ret = rw_upper [ui1] < rw_upper [ui2] ? -1 : +1;
+ else if (_rw_upper [ui1] != _rw_upper [ui2]) {
+ ret = _rw_upper [ui1] < _rw_upper [ui2] ? -1 : +1;
break;
}
}
@@ -443,7 +444,7 @@
#else // if !defined (_RWSTD_UINT64_T)
- return rw_cmpx (buf1, buf2, nelems, 8, flags);
+ return _rw_cmpx (buf1, buf2, nelems, 8, flags);
#endif // _RWSTD_UINT64_T
}
@@ -451,12 +452,12 @@
// compares two arrays of objects of unequal size
static int
-rw_cmpxx (const void* buf1,
- const void* buf2,
- _RWSTD_SIZE_T nelems,
- _RWSTD_SIZE_T size1,
- _RWSTD_SIZE_T size2,
- int flags)
+_rw_cmpxx (const void* buf1,
+ const void* buf2,
+ _RWSTD_SIZE_T nelems,
+ _RWSTD_SIZE_T size1,
+ _RWSTD_SIZE_T size2,
+ int flags)
{
int ret = 0;
int inx = 0;
@@ -528,7 +529,8 @@
default:
fprintf (stderr,
"%s:%d: comparison of objects %u and %u bytes in size "
- "not implemented\n", __FILE__, __LINE__, size1, size2);
+ "not implemented\n", __FILE__, __LINE__,
+ unsigned (size1), unsigned (size2));
abort ();
}
@@ -585,7 +587,8 @@
default:
fprintf (stderr,
"%s:%d: comparison of objects %u and %u bytes in size "
- "not implemented\n", __FILE__, __LINE__, size1, size2);
+ "not implemented\n", __FILE__, __LINE__,
+ unsigned (size1), unsigned (size2));
abort ();
}
@@ -608,8 +611,8 @@
ret = ui1 < ui2 ? -1 : +1;
break;
}
- else if (rw_upper [ui1] != rw_upper [ui2]) {
- ret = rw_upper [ui1] < rw_upper [ui2] ? -1 : +1;
+ else if (_rw_upper [ui1] != _rw_upper [ui2]) {
+ ret = _rw_upper [ui1] < _rw_upper [ui2] ? -1 : +1;
break;
}
}
@@ -639,16 +642,16 @@
if (size1 == size2) {
switch (size1) {
- case 1: return rw_cmp1 (buf1, buf2, nelems, flags);
- case 2: return rw_cmp2 (buf1, buf2, nelems, flags);
- case 4: return rw_cmp4 (buf1, buf2, nelems, flags);
- case 8: return rw_cmp8 (buf1, buf2, nelems, flags);
+ case 1: return _rw_cmp1 (buf1, buf2, nelems, flags);
+ case 2: return _rw_cmp2 (buf1, buf2, nelems, flags);
+ case 4: return _rw_cmp4 (buf1, buf2, nelems, flags);
+ case 8: return _rw_cmp8 (buf1, buf2, nelems, flags);
}
- return rw_cmpx (buf1, buf2, nelems, size1, flags);
+ return _rw_cmpx (buf1, buf2, nelems, size1, flags);
}
- return rw_cmpxx (buf1, buf2, nelems, size1, size2, flags);
+ return _rw_cmpxx (buf1, buf2, nelems, size1, size2, flags);
}
@@ -720,6 +723,9 @@
# error no integral type of the same size as float exists
#endif
+ if (x == y)
+ return 0;
+
// make both arguments lexicographically ordered as twos-complement ints
IntT x_int = *(IntT*)&x;
if (x_int < 0)
@@ -752,6 +758,9 @@
# error no integral type of the same size as double exists
#endif
+ if (x == y)
+ return 0;
+
IntT x_int = *(IntT*)&x;
if (x_int < 0)
x_int = imin - x_int;
@@ -774,8 +783,11 @@
if (sizeof (long double) == sizeof (double))
return rw_dblcmp (double (x), double (y));
- // FIXME: implement reliable comparison for 128-bit long doubles
- return rw_dblcmp (double (x), double (y));
+ if (x == y)
+ return 0;
+
+ // FIXME: use integer math as in the functions above
+ return memcmp (&x, &y, sizeof x);
}
#endif // _RWSTD_NO_LONG_DOUBLE