ThePEG  1.8.0
Interval.h
1 // -*- C++ -*-
2 //
3 // Interval.h is a part of ThePEG - Toolkit for HEP Event Generation
4 // Copyright (C) 1999-2011 Leif Lonnblad
5 //
6 // ThePEG is licenced under version 2 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef ThePEG_Interval_H
10 #define ThePEG_Interval_H
11 // This is the declaration of the Interval class.
12 
13 #include <utility>
14 #include <vector>
15 #include "Interval.fh"
16 #include "ThePEG/Utilities/UnitIO.h"
17 
18 namespace ThePEG {
19 
20 template <typename T, typename CMP>
27 class Interval {
28 
29 public:
30 
34  Interval() : theLimits(pair<T,T>()) {}
35 
39  Interval(T dn, T up) : theLimits(pair<T,T>(dn, up)) {}
40 
44  bool operator==(const Interval & i) const {
45  return lower() == i.lower() && upper() == i.upper();
46  }
47 
53  bool operator<(const Interval & i) const {
54  return cmp(lower(), i.lower()) ||
55  ( lower() == i.lower() && cmp(upper(), i.upper()) );
56  }
57 
61  bool check() const { return cmp(lower(), upper()); }
62 
66  bool operator()(T x) const { return includes(x); }
67 
71  bool includes(T x) const { return !cmp(x, lower()) && cmp(x, upper()); }
72 
76  bool includes(const Interval<T,CMP> & i) const {
77  return includes(i.lower()) && !cmp(upper(), i.upper());
78  }
79 
87  if ( includes(x) ) {
88  r.lower(x);
89  r.upper(upper());
90  upper(x);
91  }
92  return r;
93  }
94 
101  Interval<T,CMP> r;
102  if ( includes(x) ) {
103  r.lower(lower());
104  r.upper(x);
105  lower(x);
106  }
107  return r;
108  }
109 
113  Interval<T,CMP> overlap(const Interval & i) const {
114  Interval<T,CMP> res;
115  if ( operator==(i) ) res = i;
116  if ( includes(i.upper()) || includes(i.lower()) )
117  res = Interval<T,CMP>(max(lower(),i.lower()), min(upper(), i.upper()));
118  return res;
119  }
120 
125  Interval<T,CMP> sum(const Interval & i) const {
126  Interval<T,CMP> res;
127  if ( operator==(i) ) res = i;
128  if ( includes(i.upper()) || includes(i.lower()) )
129  res = Interval<T,CMP>(min(lower(),i.lower()), max(upper(), i.upper()));
130  return res;
131  }
132 
136  T upper() const { return theLimits.second; }
137 
141  T lower() const { return theLimits.first; }
142 
146  void upper(T up) { theLimits.second = up; }
147 
151  void lower(T dn) { theLimits.first = dn; }
152 
157  template <typename Iterator>
158  bool check(Iterator first, Iterator last);
159 
164  template <typename Iterator>
165  bool checkAll(Iterator first, Iterator last);
166 
171  std::vector< Interval<T,CMP> > split(Interval<T,CMP>, T x);
172 
177  template<typename Iterator>
178  std::vector< Interval<T,CMP> > split(Interval<T,CMP>,
179  Iterator first, Iterator last);
180 
181 private:
182 
184  std::pair<T,T> theLimits;
185 
187  static CMP cmp;
188 
189 };
190 
193 
196 template <typename T, typename CMP>
197 inline Interval<T,CMP> makeInterval(T dn, T up) { return Interval<T,CMP>(dn, up); }
198 
200 template <typename OStream, typename T, typename CMP>
201 inline OStream & operator<<(OStream & os, const Interval<T,CMP> & i) {
202  os << i.lower() << i.upper();
203  return os;
204 }
205 
207 template <typename IStream, typename T, typename CMP>
208 inline IStream & operator>>(IStream & is, Interval<T,CMP> & i) {
209  T up, dn;
210  is >> dn >> up;
211  i.lower(dn);
212  i.upper(up);
213  return is;
214 }
215 
221 template <typename OStream, typename T, typename CMP, typename UT>
222 void ounitstream(OStream & os, const Interval<T,CMP> & i, UT & u) {
223  os << ounit(i.lower(), u) << ounit(i.upper(), u);
224 }
225 
231 template <typename IStream, typename T, typename CMP, typename UT>
232 void iunitstream(IStream & is, Interval<T,CMP> & i, UT & u) {
233  T low, upp;
234  is >> iunit(low, u) >> iunit(upp, u);
235  i = Interval<T,CMP>(low, upp);
236 }
237 
238 }
239 
240 #ifndef ThePEG_TEMPLATES_IN_CC_FILE
241 #include "Interval.tcc"
242 #endif
243 
244 #endif /* ThePEG_Interval_H */