OSDN Git Service

2004-10-10 Benjamin Kosnik <bkoz@redhat.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / valarray_array.tcc
index 289001c..fac5de6 100644 (file)
 
 // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
 
-#ifndef _VALARRAY_ARRAY_TCC 
+#ifndef _VALARRAY_ARRAY_TCC
 #define _VALARRAY_ARRAY_TCC 1
 
 namespace std
 {
   template<typename _Tp>
     void
-    __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m, 
+    __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m,
                    const _Tp& __t)
     {
       _Tp* __p = __a._M_data;
       bool* __ok (__m._M_data);
-      for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p) 
+      for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p)
        {
-         while (!*__ok) 
+         while (!*__ok)
          {
            ++__ok;
            ++__p;
@@ -51,18 +51,24 @@ namespace std
          *__p = __t;
        }
     }
-  
+
+  // Copy n elements of a into consecutive elements of b.  When m is
+  // false, the corresponding element of a is skipped.  m must contain
+  // at least n true elements.  a must contain at least n elements and
+  // enough elements to match up with m through the nth true element
+  // of m.  I.e.  if n is 10, m has 15 elements with 5 false followed
+  // by 10 true, a must have 15 elements.
   template<typename _Tp>
     void
-    __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b, 
+    __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b,
                    size_t __n)
     {
       _Tp* __p (__a._M_data);
       bool* __ok (__m._M_data);
-      for (_Tp* __q = __b._M_data; __q < __b._M_data + __n; 
-          ++__q, ++__ok, ++__p) 
+      for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
+          ++__q, ++__ok, ++__p)
        {
-         while (! *__ok) 
+         while (! *__ok)
            {
              ++__ok;
              ++__p;
@@ -71,17 +77,23 @@ namespace std
        }
     }
 
+  // Copy n consecutive elements from a into elements of b.  Elements
+  // of b are skipped if the corresponding element of m is false.  m
+  // must contain at least n true elements.  b must have at least as
+  // many elements as the index of the nth true element of m.  I.e. if
+  // m has 15 elements with 5 false followed by 10 true, b must have
+  // at least 15 elements.
   template<typename _Tp>
     void
-    __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b, 
+    __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
                    _Array<bool> __m)
     {
       _Tp* __q (__b._M_data);
       bool* __ok (__m._M_data);
-      for (_Tp* __p = __a._M_data; __p < __a._M_data+__n; 
-          ++__p, ++__ok, ++__q) 
+      for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
+          ++__p, ++__ok, ++__q)
        {
-         while (! *__ok) 
+         while (! *__ok)
            {
              ++__ok;
              ++__q;
@@ -90,45 +102,102 @@ namespace std
        }
     }
 
+  // Copy n elements from a into elements of b.  Elements of a are
+  // skipped if the corresponding element of m is false.  Elements of
+  // b are skipped if the corresponding element of k is false.  m and
+  // k must contain at least n true elements.  a and b must have at
+  // least as many elements as the index of the nth true element of m.
+  template<typename _Tp>
+    void
+    __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n,
+                   _Array<_Tp> __b, _Array<bool> __k)
+    {
+      _Tp* __p (__a._M_data);
+      _Tp* __q (__b._M_data);
+      bool* __srcok (__m._M_data);
+      bool* __dstok (__k._M_data);
+      for (size_t __i = 0; __i < __n;
+          ++__srcok, ++__p, ++__dstok, ++__q, ++__i)
+       {
+         while (! *__srcok)
+           {
+             ++__srcok;
+             ++__p;
+           }
+         while (! *__dstok) 
+           {
+             ++__dstok;
+             ++__q;
+           }
+         *__q = *__p;
+       }
+    }
+
+  // Copy n consecutive elements of e into consecutive elements of a.
+  // I.e. a[i] = e[i].
   template<typename _Tp, class _Dom>
     void
     __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a)
     {
       _Tp* __p (__a._M_data);
-      for (size_t __i = 0; __i < __n; ++__i, ++__p) 
+      for (size_t __i = 0; __i < __n; ++__i, ++__p)
        *__p = __e[__i];
     }
 
+  // Copy n consecutive elements of e into elements of a using stride
+  // s.  I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
   template<typename _Tp, class _Dom>
     void
-    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 
+    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
                     _Array<_Tp> __a, size_t __s)
     {
       _Tp* __p (__a._M_data);
-      for (size_t __i = 0; __i < __n; ++__i, __p += __s) 
+      for (size_t __i = 0; __i < __n; ++__i, __p += __s)
        *__p = __e[__i];
     }
 
+  // Copy n consecutive elements of e into elements of a indexed by
+  // contents of i.  I.e., a[i[0]] = e[0].
   template<typename _Tp, class _Dom>
     void
-    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 
+    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
                    _Array<_Tp> __a, _Array<size_t> __i)
     {
       size_t* __j (__i._M_data);
-      for (size_t __k = 0; __k < __n; ++__k, ++__j) 
+      for (size_t __k = 0; __k < __n; ++__k, ++__j)
        __a._M_data[*__j] = __e[__k];
     }
 
+  // Copy n elements of e indexed by contents of f into elements of a
+  // indexed by contents of i.  I.e., a[i[0]] = e[f[0]].
+  template<typename _Tp>
+    void
+    __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f,
+                   size_t __n, 
+                   _Array<_Tp> __a, _Array<size_t> __i)
+    {
+      size_t* __g (__f._M_data);
+      size_t* __j (__i._M_data);
+      for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g) 
+       __a._M_data[*__j] = __e._M_data[*__g];
+    }
+
+  // Copy n consecutive elements of e into elements of a.  Elements of
+  // a are skipped if the corresponding element of m is false.  m must
+  // have at least n true elements and a must have at least as many
+  // elements as the index of the nth true element of m.  I.e. if m
+  // has 5 false followed by 10 true elements and n == 10, a must have
+  // at least 15 elements.
   template<typename _Tp, class _Dom>
     void
-    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, 
+    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
                    _Array<_Tp> __a, _Array<bool> __m)
     {
       bool* __ok (__m._M_data);
       _Tp* __p (__a._M_data);
-      for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p) 
+      for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)
        {
-         while (! *__ok) 
+         while (! *__ok)
            {
              ++__ok;
              ++__p;
@@ -136,7 +205,7 @@ namespace std
          *__p = __e[__i];
        }
     }
-  
+
 
   template<typename _Tp, class _Dom>
     void
@@ -144,7 +213,7 @@ namespace std
                              _Array<_Tp> __a)
     {
       _Tp* __p (__a._M_data);
-      for (size_t __i = 0; __i < __n; ++__i, ++__p) 
+      for (size_t __i = 0; __i < __n; ++__i, ++__p)
        new (__p) _Tp(__e[__i]);
     }
 
@@ -158,7 +227,7 @@ namespace std
       bool* __ok (__m._M_data);
       for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p)
        {
-         while (! *__ok) 
+         while (! *__ok)
            {
              ++__ok;
              ++__p;