Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // The template and inlines for the -*- C++ -*- internal _Array helper class.
  2.  
  3. // Copyright (C) 1997-2015 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 3, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU General Public License for more details.
  15.  
  16. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25. /** @file bits/valarray_array.tcc
  26.  *  This is an internal header file, included by other library headers.
  27.  *  Do not attempt to use it directly. @headername{valarray}
  28.  */
  29.  
  30. // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
  31.  
  32. #ifndef _VALARRAY_ARRAY_TCC
  33. #define _VALARRAY_ARRAY_TCC 1
  34.  
  35. namespace std _GLIBCXX_VISIBILITY(default)
  36. {
  37. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  38.  
  39.   template<typename _Tp>
  40.     void
  41.     __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m,
  42.                     const _Tp& __t)
  43.     {
  44.       _Tp* __p = __a._M_data;
  45.       bool* __ok (__m._M_data);
  46.       for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p)
  47.         {
  48.           while (!*__ok)
  49.           {
  50.             ++__ok;
  51.             ++__p;
  52.           }
  53.           *__p = __t;
  54.         }
  55.     }
  56.  
  57.   // Copy n elements of a into consecutive elements of b.  When m is
  58.   // false, the corresponding element of a is skipped.  m must contain
  59.   // at least n true elements.  a must contain at least n elements and
  60.   // enough elements to match up with m through the nth true element
  61.   // of m.  I.e.  if n is 10, m has 15 elements with 5 false followed
  62.   // by 10 true, a must have 15 elements.
  63.   template<typename _Tp>
  64.     void
  65.     __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b,
  66.                     size_t __n)
  67.     {
  68.       _Tp* __p (__a._M_data);
  69.       bool* __ok (__m._M_data);
  70.       for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
  71.            ++__q, ++__ok, ++__p)
  72.         {
  73.           while (! *__ok)
  74.             {
  75.               ++__ok;
  76.               ++__p;
  77.             }
  78.           *__q = *__p;
  79.         }
  80.     }
  81.  
  82.   // Copy n consecutive elements from a into elements of b.  Elements
  83.   // of b are skipped if the corresponding element of m is false.  m
  84.   // must contain at least n true elements.  b must have at least as
  85.   // many elements as the index of the nth true element of m.  I.e. if
  86.   // m has 15 elements with 5 false followed by 10 true, b must have
  87.   // at least 15 elements.
  88.   template<typename _Tp>
  89.     void
  90.     __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
  91.                     _Array<bool> __m)
  92.     {
  93.       _Tp* __q (__b._M_data);
  94.       bool* __ok (__m._M_data);
  95.       for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
  96.            ++__p, ++__ok, ++__q)
  97.         {
  98.           while (! *__ok)
  99.             {
  100.               ++__ok;
  101.               ++__q;
  102.             }
  103.           *__q = *__p;
  104.         }
  105.     }
  106.  
  107.   // Copy n elements from a into elements of b.  Elements of a are
  108.   // skipped if the corresponding element of m is false.  Elements of
  109.   // b are skipped if the corresponding element of k is false.  m and
  110.   // k must contain at least n true elements.  a and b must have at
  111.   // least as many elements as the index of the nth true element of m.
  112.   template<typename _Tp>
  113.     void
  114.     __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n,
  115.                     _Array<_Tp> __b, _Array<bool> __k)
  116.     {
  117.       _Tp* __p (__a._M_data);
  118.       _Tp* __q (__b._M_data);
  119.       bool* __srcok (__m._M_data);
  120.       bool* __dstok (__k._M_data);
  121.       for (size_t __i = 0; __i < __n;
  122.            ++__srcok, ++__p, ++__dstok, ++__q, ++__i)
  123.         {
  124.           while (! *__srcok)
  125.             {
  126.               ++__srcok;
  127.               ++__p;
  128.             }
  129.           while (! *__dstok)
  130.             {
  131.               ++__dstok;
  132.               ++__q;
  133.             }
  134.           *__q = *__p;
  135.         }
  136.     }
  137.  
  138.   // Copy n consecutive elements of e into consecutive elements of a.
  139.   // I.e. a[i] = e[i].
  140.   template<typename _Tp, class _Dom>
  141.     void
  142.     __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a)
  143.     {
  144.       _Tp* __p (__a._M_data);
  145.       for (size_t __i = 0; __i < __n; ++__i, ++__p)
  146.         *__p = __e[__i];
  147.     }
  148.  
  149.   // Copy n consecutive elements of e into elements of a using stride
  150.   // s.  I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
  151.   template<typename _Tp, class _Dom>
  152.     void
  153.     __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
  154.                      _Array<_Tp> __a, size_t __s)
  155.     {
  156.       _Tp* __p (__a._M_data);
  157.       for (size_t __i = 0; __i < __n; ++__i, __p += __s)
  158.         *__p = __e[__i];
  159.     }
  160.  
  161.   // Copy n consecutive elements of e into elements of a indexed by
  162.   // contents of i.  I.e., a[i[0]] = e[0].
  163.   template<typename _Tp, class _Dom>
  164.     void
  165.     __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
  166.                     _Array<_Tp> __a, _Array<size_t> __i)
  167.     {
  168.       size_t* __j (__i._M_data);
  169.       for (size_t __k = 0; __k < __n; ++__k, ++__j)
  170.         __a._M_data[*__j] = __e[__k];
  171.     }
  172.  
  173.   // Copy n elements of e indexed by contents of f into elements of a
  174.   // indexed by contents of i.  I.e., a[i[0]] = e[f[0]].
  175.   template<typename _Tp>
  176.     void
  177.     __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f,
  178.                     size_t __n,
  179.                     _Array<_Tp> __a, _Array<size_t> __i)
  180.     {
  181.       size_t* __g (__f._M_data);
  182.       size_t* __j (__i._M_data);
  183.       for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g)
  184.         __a._M_data[*__j] = __e._M_data[*__g];
  185.     }
  186.  
  187.   // Copy n consecutive elements of e into elements of a.  Elements of
  188.   // a are skipped if the corresponding element of m is false.  m must
  189.   // have at least n true elements and a must have at least as many
  190.   // elements as the index of the nth true element of m.  I.e. if m
  191.   // has 5 false followed by 10 true elements and n == 10, a must have
  192.   // at least 15 elements.
  193.   template<typename _Tp, class _Dom>
  194.     void
  195.     __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
  196.                     _Array<_Tp> __a, _Array<bool> __m)
  197.     {
  198.       bool* __ok (__m._M_data);
  199.       _Tp* __p (__a._M_data);
  200.       for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)
  201.         {
  202.           while (! *__ok)
  203.             {
  204.               ++__ok;
  205.               ++__p;
  206.             }
  207.           *__p = __e[__i];
  208.         }
  209.     }
  210.  
  211.  
  212.   template<typename _Tp, class _Dom>
  213.     void
  214.     __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n,
  215.                               _Array<_Tp> __a)
  216.     {
  217.       _Tp* __p (__a._M_data);
  218.       for (size_t __i = 0; __i < __n; ++__i, ++__p)
  219.         new (__p) _Tp(__e[__i]);
  220.     }
  221.  
  222.  
  223.   template<typename _Tp>
  224.     void
  225.     __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m,
  226.                               _Array<_Tp> __b, size_t __n)
  227.     {
  228.       _Tp* __p (__a._M_data);
  229.       bool* __ok (__m._M_data);
  230.       for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p)
  231.         {
  232.           while (! *__ok)
  233.             {
  234.               ++__ok;
  235.               ++__p;
  236.             }
  237.           new (__q) _Tp(*__p);
  238.         }
  239.     }
  240.  
  241. _GLIBCXX_END_NAMESPACE_VERSION
  242. } // namespace
  243.  
  244. #endif /* _VALARRAY_ARRAY_TCC */
  245.