Return-Path: Delivered-To: apmail-stdcxx-commits-archive@www.apache.org Received: (qmail 44157 invoked from network); 4 Jun 2008 21:48:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 4 Jun 2008 21:48:57 -0000 Received: (qmail 64355 invoked by uid 500); 4 Jun 2008 21:49:00 -0000 Delivered-To: apmail-stdcxx-commits-archive@stdcxx.apache.org Received: (qmail 64327 invoked by uid 500); 4 Jun 2008 21:49:00 -0000 Mailing-List: contact commits-help@stdcxx.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@stdcxx.apache.org Delivered-To: mailing list commits@stdcxx.apache.org Received: (qmail 64318 invoked by uid 99); 4 Jun 2008 21:49:00 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Jun 2008 14:49:00 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 Jun 2008 21:48:19 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C2E492388A06; Wed, 4 Jun 2008 14:48:36 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r663377 - in /stdcxx/branches/4.2.x: include/valarray src/valarray.cpp tests/numerics/26.class.gslice.cpp tests/regress/26.valarray.sub.stdcxx-955.cpp Date: Wed, 04 Jun 2008 21:48:36 -0000 To: commits@stdcxx.apache.org From: vitek@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080604214836.C2E492388A06@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 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 make_array (const char *s) { - if (0 == s) - return std::valarray(); - 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(buf, i + 1); + break; s = end + 1; } + + return std::valarray(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 va (maxinx + 1); + std::valarray 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 +#include +#include + + +int main () +{ + const std::size_t p_leng [] = { 2, 0 }; + const std::size_t p_strd [] = { 1, 3 }; + + const std::valarray + va_leng (p_leng, sizeof (p_leng) / sizeof (*p_leng)); + + const std::valarray + va_strd (p_strd, sizeof (p_strd) / sizeof (*p_strd)); + + const std::gslice gs_slice (1, va_leng, va_strd); + + std::valarray 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