1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2 /*
3  *  Main authors:
4  *     Christian Schulte <schulte@gecode.org>
5  *
6  *  Copyright:
7  *     Christian Schulte, 2008
8  *
9  *  This file is part of Gecode, the generic constraint
10  *  development environment:
11  *     http://www.gecode.org
12  *
13  *  Permission is hereby granted, free of charge, to any person obtaining
14  *  a copy of this software and associated documentation files (the
15  *  "Software"), to deal in the Software without restriction, including
16  *  without limitation the rights to use, copy, modify, merge, publish,
17  *  distribute, sublicense, and/or sell copies of the Software, and to
18  *  permit persons to whom the Software is furnished to do so, subject to
19  *  the following conditions:
20  *
21  *  The above copyright notice and this permission notice shall be
22  *  included in all copies or substantial portions of the Software.
23  *
24  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31  *
32  */
33 
34 namespace Gecode { namespace Iter { namespace Values {
35 
36   /**
37    * \brief Value iterator for selecting only positive values
38    *
39    * If \a strict is true, zero is included.
40    * \ingroup FuncIterValues
41    */
42   template<class I, bool strict=false>
43   class Positive {
44   protected:
45     /// Input iterator
46     I i;
47   public:
48     /// \name Constructors and initialization
49     //@{
50     /// Default constructor
51     Positive(void);
52     /// Initialize with values from \a i
53     Positive(I& i);
54     /// Initialize with values from \a i
55     void init(I& i);
56     //@}
57 
58     /// \name Iteration control
59     //@{
60     /// Test whether iterator is still at a value or done
61     bool operator ()(void) const;
62     /// Move iterator to next value (if possible)
63     void operator ++(void);
64     //@}
65 
66     /// \name Value access
67     //@{
68     /// Return current value
69     int val(void) const;
70     //@}
71   };
72 
73 
74   template<class I, bool strict>
75   forceinline
Positive(void)76   Positive<I,strict>::Positive(void) {}
77 
78   template<class I, bool strict>
79   forceinline void
init(I & i0)80   Positive<I,strict>::init(I& i0) {
81     i=i0;
82     if (strict) {
83       while (i() && (i.val() <= 0)) ++i;
84     } else {
85       while (i() && (i.val() < 0)) ++i;
86     }
87   }
88 
89   template<class I, bool strict>
90   forceinline
Positive(I & i0)91   Positive<I,strict>::Positive(I& i0) : i(i0) {
92     if (strict) {
93       while (i() && (i.val() <= 0)) ++i;
94     } else {
95       while (i() && (i.val() < 0)) ++i;
96     }
97   }
98 
99   template<class I, bool strict>
100   forceinline void
operator ++(void)101   Positive<I,strict>::operator ++(void) {
102     ++i;
103   }
104   template<class I, bool strict>
105   forceinline bool
operator ()(void) const106   Positive<I,strict>::operator ()(void) const {
107     return i();
108   }
109 
110   template<class I, bool strict>
111   forceinline int
val(void) const112   Positive<I,strict>::val(void) const {
113     return i.val();
114   }
115 
116 }}}
117 
118 // STATISTICS: iter-any
119 
120