Author: vitek Date: Wed Jun 4 14:48:36 2008 New Revision: 663377 URL: http://svn.apache.org/viewvc?rev=663377&view=rev Log: 2008-06-04 Travis Vitek <[EMAIL PROTECTED]>
STDCXX-955 * include/valarray: Correctly calculate indices when the length array contains a zero. * src/valarray.cpp: Ditto. * tests/numerics/26.class.gslice.cpp (make_array): Update to handle empty strings or other poorly formatted input. (get_array_size, next_index): Correctly calculate indices when the slice length array contains a zero. (test_gslice): Remove unnecessary line feed from assertion. (run_test): Update degenerate testcase to match comment. * tests/regress/26.valarray.sub.stdcxx-995.cpp: Add new regression test. Added: stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp (with props) Modified: stdcxx/branches/4.2.x/include/valarray stdcxx/branches/4.2.x/src/valarray.cpp stdcxx/branches/4.2.x/tests/numerics/26.class.gslice.cpp Modified: stdcxx/branches/4.2.x/include/valarray URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/include/valarray?rev=663377&r1=663376&r2=663377&view=diff ============================================================================== --- stdcxx/branches/4.2.x/include/valarray (original) +++ stdcxx/branches/4.2.x/include/valarray Wed Jun 4 14:48:36 2008 @@ -2039,10 +2039,12 @@ if (_C_length.size () == 0) return 0; - _RWSTD_SIZE_T __inx = 1; + _RWSTD_SIZE_T __inx = _C_length [0] != 0; - for(_RWSTD_SIZE_T __i = 0; __i < _C_length.size (); ++__i) - __inx *= _C_length [__i]; + for(_RWSTD_SIZE_T __i = 0; __i < _C_length.size (); ++__i) { + if (_C_length [__i]) + __inx *= _C_length [__i]; + } return __inx; } Modified: stdcxx/branches/4.2.x/src/valarray.cpp URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/src/valarray.cpp?rev=663377&r1=663376&r2=663377&view=diff ============================================================================== --- stdcxx/branches/4.2.x/src/valarray.cpp (original) +++ stdcxx/branches/4.2.x/src/valarray.cpp Wed Jun 4 14:48:36 2008 @@ -41,8 +41,12 @@ { _RWSTD_SIZE_T __n = _C_length.size (); - while (__n && _C_r_length [__n - 1] == _C_length [__n - 1] - 1) - --__n; + for (/**/; __n; --__n) + { + if ( _C_length [__n - 1] + && _C_r_length [__n - 1] != _C_length [__n - 1] - 1) + break; + } if (0 == __n) { _C_reset = true; Modified: stdcxx/branches/4.2.x/tests/numerics/26.class.gslice.cpp URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/tests/numerics/26.class.gslice.cpp?rev=663377&r1=663376&r2=663377&view=diff ============================================================================== --- stdcxx/branches/4.2.x/tests/numerics/26.class.gslice.cpp (original) +++ stdcxx/branches/4.2.x/tests/numerics/26.class.gslice.cpp Wed Jun 4 14:48:36 2008 @@ -35,25 +35,28 @@ static std::valarray<std::size_t> make_array (const char *s) { - if (0 == s) - return std::valarray<std::size_t>(); - std::size_t buf [256]; - for (std::size_t i = 0; ; ++i) { + std::size_t i = 0; + while (s && *s) { char *end; unsigned long val = std::strtoul (s, &end, 10); RW_ASSERT ('\0' == *end || ',' == *end); - buf [i] = std::size_t (val); + if (s == end) + break; + + buf [i++] = std::size_t (val); if ('\0' == *end) - return std::valarray<std::size_t>(buf, i + 1); + break; s = end + 1; } + + return std::valarray<std::size_t>(buf, i); } /**************************************************************************/ @@ -67,7 +70,8 @@ std::size_t asize = sizes.size () ? 1 : 0; for (std::size_t i = 0; i != sizes.size (); ++i) { - asize *= sizes [i]; + if (sizes [i]) + asize *= sizes [i]; } return asize; @@ -92,8 +96,11 @@ return start; } - while (inx && factors [inx - 1] == asizes [inx - 1] - 1) - --inx; + for (/**/; inx; --inx) { + if ( asizes [inx - 1] + && factors [inx - 1] != asizes [inx - 1] - 1) + break; + } if (0 == inx) { factors = 0; @@ -156,12 +163,12 @@ if (maxinx < indices [i]) maxinx = indices [i]; - std::valarray<std::size_t> va (maxinx + 1); + std::valarray<std::size_t> va (indices.size () ? maxinx + 1 : 0); for (std::size_t i = 0; i != va.size (); ++i) va [i] = i; for (int i = 0; i != 3; ++i) { - // repeat each test three to verify that operator[](gslice) + // repeat each test thrice to verify that operator[](gslice) // doesn't change the observable state of its argument and // that the same result is obtained for a copy of gslice @@ -171,7 +178,7 @@ bool equal = array_slice.size () == indices.size (); rw_assert (equal, 0, __LINE__, - "size() == %zu, got %zu\n", + "size() == %zu, got %zu", indices.size (), array_slice.size ()); if (equal) { @@ -180,7 +187,7 @@ equal = array_slice [j] == va [indices [j]]; rw_assert (equal, 0, __LINE__, - "mismatch at %u, index %u: expected %u, got %u\n", + "mismatch at %u, index %u: expected %u, got %u", j, indices [j], va [indices [j]], array_slice [j]); } @@ -223,7 +230,7 @@ test_gslice ("2,4,3", "19,4,1"); // includes example of a degenerate gslice from p5 - test_gslice ("2,4,3", "19,4,1"); + test_gslice ("2,4,3", "1,1,1"); return 0; } Added: stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp URL: http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp?rev=663377&view=auto ============================================================================== --- stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp (added) +++ stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp Wed Jun 4 14:48:36 2008 @@ -0,0 +1,59 @@ +/************************************************************************ + * + * 26.valarray.sub.stdcxx-955.cpp - regression test for STDCXX-955 + * + * http://issues.apache.org/jira/browse/STDCXX-955 + * + * $Id$ + * + *************************************************************************** + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Copyright 1994-2008 Rogue Wave Software, Inc. + * + **************************************************************************/ + +#include <cstdlib> +#include <valarray> +#include <cassert> + + +int main () +{ + const std::size_t p_leng [] = { 2, 0 }; + const std::size_t p_strd [] = { 1, 3 }; + + const std::valarray<std::size_t> + va_leng (p_leng, sizeof (p_leng) / sizeof (*p_leng)); + + const std::valarray<std::size_t> + va_strd (p_strd, sizeof (p_strd) / sizeof (*p_strd)); + + const std::gslice gs_slice (1, va_leng, va_strd); + + std::valarray<char> va_lhs ('!', 4); + + va_lhs [gs_slice] = '?'; + + assert (va_lhs [0] == '!'); + assert (va_lhs [1] == '?'); + assert (va_lhs [2] == '?'); + assert (va_lhs [3] == '!'); + + return 0; +} Propchange: stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp ------------------------------------------------------------------------------ svn:eol-style = native Propchange: stdcxx/branches/4.2.x/tests/regress/26.valarray.sub.stdcxx-955.cpp ------------------------------------------------------------------------------ svn:keywords = Id