1 /*
 2  *   Copyright (c) 2010, Michael Lehn
 3  *
 4  *   All rights reserved.
 5  *
 6  *   Redistribution and use in source and binary forms, with or without
 7  *   modification, are permitted provided that the following conditions
 8  *   are met:
 9  *
10  *   1) Redistributions of source code must retain the above copyright
11  *      notice, this list of conditions and the following disclaimer.
12  *   2) Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in
14  *      the documentation and/or other materials provided with the
15  *      distribution.
16  *   3) Neither the name of the FLENS development group nor the names of
17  *      its contributors may be used to endorse or promote products derived
18  *      from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef FLENS_VECTORTYPES_IMPL_DV_ELEMENTCLOSURE_TCC
34 #define FLENS_VECTORTYPES_IMPL_DV_ELEMENTCLOSURE_TCC 1
35 
36 namespace flens { namespace densevector {
37 
38 template <typename V>
39 ElementClosure<V>::ElementClosure(Vector &vector, IndexVariable &index)
40     : _vector(vector), _index(index)
41 {
42 }
43 
44 template <typename V>
45 void
46 ElementClosure<V>::operator=(const ElementType &rhs)
47 {
48     typename IndexVariable::ElementType &i = _index.value();
49 
50     for (i=_vector.firstIndex(); i<=_vector.lastIndex(); ++i) {
51         value() = rhs;
52     }
53 }
54 
55 template <typename V>
56 template <typename S>
57 void
58 ElementClosure<V>::operator=(const Scalar<S> &rhs)
59 {
60     typename IndexVariable::ElementType &i = _index.value();
61 
62     for (i=_vector.firstIndex(); i<=_vector.lastIndex(); ++i) {
63         value() = rhs.impl().value();
64     }
65 }
66 
67 template <typename V>
68 void
69 ElementClosure<V>::operator=(const ElementClosure &rhs)
70 {
71     typename IndexVariable::ElementType &i = _index.value();
72 
73     for (i=_vector.firstIndex(); i<=_vector.lastIndex(); ++i) {
74         value() = rhs.impl().value();
75     }
76 }
77 
78 template <typename V>
79 const typename ElementClosure<V>::ElementType &
80 ElementClosure<V>::value() const
81 {
82     return _vector(_index.value());
83 }
84 
85 template <typename V>
86 typename ElementClosure<V>::ElementType &
87 ElementClosure<V>::value()
88 {
89     return _vector(_index.value());
90 }
91 
92 } } // namespace densevector, flens
93 
94 #endif // FLENS_VECTORTYPES_IMPL_DV_ELEMENTCLOSURE_TCC