/*************************************************************************** * * 26.valarray.transcend.cpp - verify [lib.valarray.transcend] requirements * * $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. * **************************************************************************/ // disable implicit inclusion to work around a limitation in // IBM's VisualAge 5.0.2.0 (see PR#26959) #if defined __IBMCPP__ && !defined _RWSTD_NO_IMPLICIT_INCLUSION # define _RWSTD_NO_IMPLICIT_INCLUSION #endif // defined __IBMCPP__ && !defined _RWSTD_NO_IMPLICIT_INCLUSION #include #include // for std::size_t #include #include #include /**************************************************************************/ template static void test_val (const char* tname) { #define TEST(fun) { \ rw_info (0, __FILE__, __LINE__, "template <> std::valarray<%s> " \ "std::" #fun " (std::valarray<%s>)", tname, tname); \ \ std::valarray val (10); \ for (std::size_t i = 0; i != val.size (); ++i) \ val [i] = T (i); \ \ const std::valarray result = std::fun (val); \ \ bool success = 10 == val.size () && val.size () == result.size (); \ \ for (std::size_t j = 0; success && j != result.size (); ++j) { \ if (!rw_equal (result [j], T (std::fun (T (j))))) \ success = false; \ } \ \ rw_assert (success, __FILE__, __LINE__, \ "template <> std::valarray<%s> std::" #fun \ "(std::valarray<%s>)", tname, tname); \ } (void)0 #define TEST_2(fun, x) { \ if (x < 0) \ rw_info (0, __FILE__, __LINE__, \ "template <> std::valarray<%s> " \ "std::" #fun " (const %s&, const std::" \ "valarray<%s>&)", tname, tname, tname); \ else if (x > 0) \ rw_info (0, __FILE__, __LINE__, \ "template <> std::valarray<%s> " \ "std::" #fun " (const std::valarray<%s>&," \ "const %s&)", tname, tname, tname); \ else \ rw_info (0, __FILE__, __LINE__, \ "template <> std::valarray<%s> " \ "std::" #fun " (const std::valarray<%s>&," \ "const std::valarray<%s>&)", tname, tname, tname); \ \ std::valarray val (10); \ for (std::size_t i = 0; i != val.size (); ++i) \ val [i] = T (i); \ \ const std::valarray result = \ x < 0 ? std::fun (T (x), val) \ : x > 0 ? std::fun (val, T (x)) \ : std::fun (val, val); \ \ bool success = 10 == val.size () && val.size () == result.size (); \ \ for (std::size_t j = 0; success && j != result.size (); ++j) { \ T res; \ if (x < 0) res = T (std::fun (T (x), T (j))); \ if (x > 0) res = T (std::fun (T (j), T (x))); \ if (!x) res = T (std::fun (T (j), T (j))); \ if (!rw_equal (result [j], res)) \ success = false; \ } \ \ rw_assert (success, __FILE__, __LINE__, \ "template <> std::valarray<%s> std::" #fun "(...)", \ tname); \ } (void)0 TEST (abs); TEST (acos); TEST (abs); TEST (acos); TEST (asin); TEST (atan); TEST_2 (atan2, -2); TEST_2 (atan2, +3); TEST_2 (atan2, 0); TEST (cos); TEST (cosh); TEST (exp); TEST (log); TEST (log10); TEST_2 (pow, -4); TEST_2 (pow, +5); TEST_2 (pow, 0); TEST (sin); TEST (sinh); TEST (sqrt); TEST (tan); TEST (tanh); } /**************************************************************************/ static int run_test (int /*unused*/, char* /*unused*/ []) { test_val ("float"); test_val ("double"); #ifndef _RWSTD_NO_LONG_DOUBLE test_val ("long double"); #endif // _RWSTD_NO_LONG_DOUBLE return 0; } /*extern*/ int main (int argc, char* argv []) { return rw_test (argc, argv, __FILE__, "lib.valarray.transcend", 0, // no comment run_test, "", 0); }