1 /* vector/subvector_source.c
2  *
3  * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or (at
8  * your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19 
QUALIFIED_VIEW(_gsl_vector,view)20 QUALIFIED_VIEW(_gsl_vector, view)
21 FUNCTION(gsl_vector, subvector) (QUALIFIED_TYPE(gsl_vector) * v, size_t offset, size_t n)
22 {
23   QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
24 
25   if (n == 0)
26     {
27       GSL_ERROR_VAL ("vector length n must be positive integer",
28                      GSL_EINVAL, view);
29     }
30 
31   if (offset + (n - 1) >= v->size)
32     {
33       GSL_ERROR_VAL ("view would extend past end of vector",
34                      GSL_EINVAL, view);
35     }
36 
37   {
38     TYPE(gsl_vector) s = NULL_VECTOR;
39 
40     s.data = v->data +  MULTIPLICITY * v->stride * offset ;
41     s.size = n;
42     s.stride = v->stride;
43     s.block = v->block;
44     s.owner = 0;
45 
46     view.vector = s;
47     return view;
48   }
49 }
50 
QUALIFIED_VIEW(_gsl_vector,view)51 QUALIFIED_VIEW(_gsl_vector, view)
52 FUNCTION(gsl_vector, subvector_with_stride) (QUALIFIED_TYPE(gsl_vector) * v, size_t offset, size_t stride, size_t n)
53 {
54   QUALIFIED_VIEW(_gsl_vector,view) view = NULL_VECTOR_VIEW;
55 
56   if (n == 0)
57     {
58       GSL_ERROR_VAL ("vector length n must be positive integer",
59                      GSL_EINVAL, view);
60     }
61 
62   if (stride == 0)
63     {
64       GSL_ERROR_VAL ("stride must be positive integer",
65                      GSL_EINVAL, view);
66     }
67 
68   if (offset + (n - 1) * stride >= v->size)
69     {
70       GSL_ERROR_VAL ("view would extend past end of vector",
71                      GSL_EINVAL, view);
72     }
73 
74   {
75     TYPE(gsl_vector) s = NULL_VECTOR;
76 
77     s.data = v->data + MULTIPLICITY * v->stride * offset ;
78     s.size = n;
79     s.stride = v->stride * stride;
80     s.block = v->block;
81     s.owner = 0;
82 
83     view.vector = s;
84     return view;
85   }
86 }
87