diff src/ov-base.cc @ 4254:df5f2e433a11

[project @ 2002-12-31 19:43:07 by jwe]
author jwe
date Tue, 31 Dec 2002 19:43:07 +0000
parents fc9a075d10fb
children e556870ce8f0
line wrap: on
line diff
--- a/src/ov-base.cc	Tue Dec 31 18:23:58 2002 +0000
+++ b/src/ov-base.cc	Tue Dec 31 19:43:07 2002 +0000
@@ -28,6 +28,8 @@
 #include <config.h>
 #endif
 
+#include <climits>
+
 #include <iostream>
 
 #include "lo-ieee.h"
@@ -196,28 +198,39 @@
   os << "no info for type: " << type_name () << "\n";
 }
 
-int
-octave_base_value::int_value (bool require_int, bool frc_str_conv) const
-{
-  int retval = 0;
-
-  double d = double_value (frc_str_conv);
+#define INT_CONV_METHOD(T, F, MIN_LIMIT, MAX_LIMIT) \
+  T \
+  octave_base_value::F ## _value (bool require_int, bool frc_str_conv) const \
+  { \
+    T retval = 0; \
+ \
+    double d = double_value (frc_str_conv); \
+ \
+    if (! error_state) \
+      { \
+	if (require_int && D_NINT (d) != d) \
+	  error ("conversion of %g to " #T " value failed", d); \
+	else if (d < MIN_LIMIT || d > MAX_LIMIT) \
+	  error ("conversion of %g to short int out of range (%d, %d)", \
+		 d, MIN_LIMIT, MAX_LIMIT); \
+	else \
+	  retval = static_cast<T> (d); \
+      } \
+    else \
+      gripe_wrong_type_arg ("octave_base_value::" #F "_value ()", \
+			    type_name ()); \
+ \
+    return retval; \
+  }
 
-  if (! error_state)
-    {
-      if (require_int && D_NINT (d) != d)
-	{
-	  error ("conversion to integer value failed");
-	  return retval;
-	}
+INT_CONV_METHOD (short int, short, SHRT_MIN, SHRT_MAX)
+INT_CONV_METHOD (unsigned short int, ushort, 0, USHRT_MAX)
 
-      retval = static_cast<int> (d);
-    }
-  else
-    gripe_wrong_type_arg ("octave_base_value::int_value ()", type_name ());
+INT_CONV_METHOD (int, int, INT_MIN, INT_MAX)
+INT_CONV_METHOD (unsigned int, uint, 0, UINT_MAX)
 
-  return retval;
-}
+INT_CONV_METHOD (long int, long, LONG_MIN, LONG_MAX)
+INT_CONV_METHOD (unsigned long int, ulong, 0, ULONG_MAX)
 
 int
 octave_base_value::nint_value (bool frc_str_conv) const