# HG changeset patch
# User Jaroslav Hajek
# Date 1211803315 -7200
# Node ID 936478aed051aafca8914e36afb89acf004d3807
# Parent edc25a3fb2bce80302402d876e660de57e332c43
simplify & cleanup octave_value::XXX_vector_value functions
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,17 @@
+2008-05-26 Jaroslav Hajek
+
+ * ov.cc (make_vector_dims): New function.
+ (vector_value, complex_vector_value, float_vector_value,
+ float_complex_vector_value): Query N-d array values and simplify,
+ avoid copying.
+ (column_vector_value, complex_column_vector_value,
+ float_column_vector_value, float_complex_column_vector_value,
+ row_vector_value, complex_row_vector_value,
+ float_row_vector_value, float_complex_row_vector_value):
+ Simplify to trivial wrappers.
+ (int_vector_value): Avoid conversions if integer type, query N-d array
+ value, simplify.
+
2008-05-21 David Bateman
* DLD-FUNCTIONS/quad.cc (quad_float_user_function): New function.
diff --git a/src/ov.cc b/src/ov.cc
--- a/src/ov.cc
+++ b/src/ov.cc
@@ -1304,173 +1304,69 @@
return rep->list_value ();
}
-ColumnVector
-octave_value::column_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+static dim_vector
+make_vector_dims (const dim_vector& dv, bool force_vector_conversion,
+ const std::string& my_type, const std::string& wanted_type)
{
- ColumnVector retval;
+ dim_vector retval (dv);
+ retval.chop_trailing_singletons ();
+ octave_idx_type nel = dv.numel ();
- Matrix m = matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nc == 1)
+ if (retval.length () > 2 || (retval(0) != 1 && retval(1) != 1))
{
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real column vector");
+ if (!force_vector_conversion)
+ gripe_implicit_conversion ("Octave:array-as-vector",
+ my_type.c_str (), wanted_type.c_str ());
+ retval = dim_vector (nel);
}
return retval;
}
+ColumnVector
+octave_value::column_vector_value (bool force_string_conv,
+ bool frc_vec_conv) const
+{
+ return ColumnVector (vector_value (force_string_conv,
+ frc_vec_conv));
+}
+
ComplexColumnVector
octave_value::complex_column_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- ComplexColumnVector retval;
-
- ComplexMatrix m = complex_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex column vector");
- }
-
- return retval;
+ return ComplexColumnVector (complex_vector_value (force_string_conv,
+ frc_vec_conv));
}
RowVector
octave_value::row_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- RowVector retval;
-
- Matrix m = matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real row vector");
- }
-
- return retval;
+ return RowVector (vector_value (force_string_conv,
+ frc_vec_conv));
}
ComplexRowVector
octave_value::complex_row_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- ComplexRowVector retval;
-
- ComplexMatrix m = complex_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex row vector");
- }
-
- return retval;
+ return ComplexRowVector (complex_vector_value (force_string_conv,
+ frc_vec_conv));
}
-
-// Sloppy...
Array
octave_value::vector_value (bool force_string_conv,
bool force_vector_conversion) const
{
- Array retval;
-
- Matrix m = matrix_value (force_string_conv);
+ Array retval = array_value (force_string_conv);
if (error_state)
return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
- else if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else if (nr > 0 && nc > 0)
- {
- if (! force_vector_conversion)
- gripe_implicit_conversion ("Octave:array-as-vector",
- type_name (), "real vector");
-
- retval.resize (nr * nc);
- octave_idx_type k = 0;
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
-
- retval (k++) = m (i, j);
- }
- }
else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real vector");
- }
-
- return retval;
+ return retval.reshape (make_vector_dims (retval.dims (),
+ force_vector_conversion,
+ type_name (), "real vector"));
}
Array
@@ -1479,364 +1375,124 @@
{
Array retval;
- Matrix m = matrix_value (force_string_conv);
+ if (is_integer_type ())
+ {
+ // query for the first type that is wide enough
+#if SIZEOF_INT == 2
+ retval = int16_array_value ();
+#elif SIZEOF_INT == 4
+ retval = int32_array_value ();
+#else
+ retval = int64_array_value ();
+#endif
+ }
+ else
+ {
+ const NDArray a = array_value (force_string_conv);
+ if (! error_state)
+ {
+ if (require_int)
+ {
+ retval.resize (a.dims ());
+ for (octave_idx_type i = 0; i < a.numel (); i++)
+ {
+ double ai = a.elem (i);
+ int v = static_cast (ai);
+ if (ai == v)
+ retval.xelem (i) = v;
+ else
+ {
+ error ("conversion to integer value failed");
+ break;
+ }
+ }
+ }
+ else
+ retval = Array (a);
+ }
+ }
+
if (error_state)
return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- {
- OCTAVE_QUIT;
-
- double d = m (0, i);
-
- if (require_int && D_NINT (d) != d)
- {
- error ("conversion to integer value failed");
- return retval;
- }
-
- retval (i) = static_cast (d);
- }
- }
- else if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
-
- double d = m (i, 0);
-
- if (require_int && D_NINT (d) != d)
- {
- error ("conversion to integer value failed");
- return retval;
- }
-
- retval (i) = static_cast (d);
- }
- }
- else if (nr > 0 && nc > 0)
- {
- if (! force_vector_conversion)
- gripe_implicit_conversion ("Octave:array-as-vector",
- type_name (), "real vector");
-
- retval.resize (nr * nc);
- octave_idx_type k = 0;
- for (octave_idx_type j = 0; j < nc; j++)
- {
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
-
- double d = m (i, j);
-
- if (require_int && D_NINT (d) != d)
- {
- error ("conversion to integer value failed");
- return retval;
- }
-
- retval (k++) = static_cast (d);
- }
- }
- }
else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real vector");
- }
-
- return retval;
+ return retval.reshape (make_vector_dims (retval.dims (),
+ force_vector_conversion,
+ type_name (), "integer vector"));
}
Array
octave_value::complex_vector_value (bool force_string_conv,
- bool force_vector_conversion) const
+ bool force_vector_conversion) const
{
- Array retval;
-
- ComplexMatrix m = complex_matrix_value (force_string_conv);
+ Array retval = complex_array_value (force_string_conv);
if (error_state)
return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- {
- OCTAVE_QUIT;
- retval (i) = m (0, i);
- }
- }
- else if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (i) = m (i, 0);
- }
- }
- else if (nr > 0 && nc > 0)
- {
- if (! force_vector_conversion)
- gripe_implicit_conversion ("Octave:array-as-vector",
- type_name (), "complex vector");
-
- retval.resize (nr * nc);
- octave_idx_type k = 0;
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (k++) = m (i, j);
- }
- }
else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex vector");
- }
-
- return retval;
+ return retval.reshape (make_vector_dims (retval.dims (),
+ force_vector_conversion,
+ type_name (), "complex vector"));
}
FloatColumnVector
octave_value::float_column_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- FloatColumnVector retval;
-
- FloatMatrix m = float_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real column vector");
- }
-
- return retval;
+ return FloatColumnVector (float_vector_value (force_string_conv,
+ frc_vec_conv));
}
FloatComplexColumnVector
octave_value::float_complex_column_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- FloatComplexColumnVector retval;
-
- FloatComplexMatrix m = float_complex_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex column vector");
- }
-
- return retval;
+ return FloatComplexColumnVector (float_complex_vector_value (force_string_conv,
+ frc_vec_conv));
}
FloatRowVector
octave_value::float_row_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- FloatRowVector retval;
-
- FloatMatrix m = float_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real row vector");
- }
-
- return retval;
+ return FloatRowVector (float_vector_value (force_string_conv,
+ frc_vec_conv));
}
FloatComplexRowVector
octave_value::float_complex_row_vector_value (bool force_string_conv,
- bool /* frc_vec_conv */) const
+ bool frc_vec_conv) const
{
- FloatComplexRowVector retval;
+ return FloatComplexRowVector (float_complex_vector_value (force_string_conv,
+ frc_vec_conv));
+}
- FloatComplexMatrix m = float_complex_matrix_value (force_string_conv);
+Array
+octave_value::float_vector_value (bool force_string_conv,
+ bool force_vector_conversion) const
+{
+ Array retval = float_array_value (force_string_conv);
if (error_state)
return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex row vector");
- }
-
- return retval;
-}
-
-// Sloppy...
-
-Array
-octave_value::float_vector_value (bool force_string_conv,
- bool force_vector_conversion) const
-{
- Array retval;
-
- FloatMatrix m = float_matrix_value (force_string_conv);
-
- if (error_state)
- return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- retval (i) = m (0, i);
- }
- else if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- retval (i) = m (i, 0);
- }
- else if (nr > 0 && nc > 0)
- {
- if (! force_vector_conversion)
- gripe_implicit_conversion ("Octave:array-as-vector",
- type_name (), "real vector");
-
- retval.resize (nr * nc);
- octave_idx_type k = 0;
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
-
- retval (k++) = m (i, j);
- }
- }
- else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "real vector");
- }
-
- return retval;
+ return retval.reshape (make_vector_dims (retval.dims (),
+ force_vector_conversion,
+ type_name (), "real vector"));
}
Array
octave_value::float_complex_vector_value (bool force_string_conv,
- bool force_vector_conversion) const
+ bool force_vector_conversion) const
{
- Array retval;
-
- FloatComplexMatrix m = float_complex_matrix_value (force_string_conv);
+ Array retval = float_complex_array_value (force_string_conv);
if (error_state)
return retval;
-
- octave_idx_type nr = m.rows ();
- octave_idx_type nc = m.columns ();
-
- if (nr == 1)
- {
- retval.resize (nc);
- for (octave_idx_type i = 0; i < nc; i++)
- {
- OCTAVE_QUIT;
- retval (i) = m (0, i);
- }
- }
- else if (nc == 1)
- {
- retval.resize (nr);
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (i) = m (i, 0);
- }
- }
- else if (nr > 0 && nc > 0)
- {
- if (! force_vector_conversion)
- gripe_implicit_conversion ("Octave:array-as-vector",
- type_name (), "complex vector");
-
- retval.resize (nr * nc);
- octave_idx_type k = 0;
- for (octave_idx_type j = 0; j < nc; j++)
- for (octave_idx_type i = 0; i < nr; i++)
- {
- OCTAVE_QUIT;
- retval (k++) = m (i, j);
- }
- }
else
- {
- std::string tn = type_name ();
- gripe_invalid_conversion (tn.c_str (), "complex vector");
- }
-
- return retval;
+ return retval.reshape (make_vector_dims (retval.dims (),
+ force_vector_conversion,
+ type_name (), "complex vector"));
}
int