vbl_triple.h
Go to the documentation of this file.
1 // This is core/vbl/vbl_triple.h
2 #ifndef vbl_triple_h_
3 #define vbl_triple_h_
4 //:
5 // \file
6 // \brief a templated 3-tuple
7 // \author fsm
8 
9 #include <iosfwd>
10 #include <utility>
11 #ifdef _MSC_VER
12 # include <vcl_msvc_warnings.h>
13 #endif
14 
15 //: a templated 3-tuple
16 template <class T1, class T2, class T3>
17 struct vbl_triple
18 {
19  typedef T1 first_type;
20  typedef T2 second_type;
21  typedef T3 third_type;
22 
23  T1 first;
24  T2 second;
25  T3 third;
26 
27  vbl_triple() = default;
28  vbl_triple(T1 const &a, T2 const &b, T3 c)
29  : first (a)
30  , second(b)
31  , third (std::move(c)) { }
32 
33  template <class U1, class U2, class U3>
35  : first (that.first )
36  , second(that.second)
37  , third (that.third ) { }
38 };
39 
40 template <class T1, class T2, class T3>
42 {
43  return
44  x.first == y.first &&
45  x.second == y.second &&
46  x.third == y.third;
47 }
48 
49 template <class T1, class T2, class T3>
51 { return !(x == y); }
52 
53 template <class T1, class T2, class T3>
55 {
56  return x.first!=y.first ? x.first<y.first :
57  (x.second!=y.second ? x.second<y.second : x.third<y.third);
58 }
59 
60 template <class T1, class T2, class T3>
61 inline vbl_triple<T1, T2, T3> vbl_make_triple(T1 const &x, T2 const &y, T3 const &z)
62 {
63  return vbl_triple<T1, T2, T3>(x, y, z);
64 }
65 
66 template <class T1, class T2, class T3>
67 inline std::ostream& operator<<(std::ostream& os, vbl_triple<T1, T2, T3> const &x)
68 {
69  return os << x.first << ' ' << x.second << ' ' << x.third;
70 }
71 
72 template <class T1, class T2, class T3>
73 inline std::istream& operator>>(std::istream& os, vbl_triple<T1, T2, T3> &x)
74 {
75  return os >> x.first >> x.second >> x.third;
76 }
77 
78 
79 #endif // vbl_triple_h_
std::ostream & operator<<(std::ostream &os, vbl_triple< T1, T2, T3 > const &x)
Definition: vbl_triple.h:67
a templated 3-tuple.
Definition: vbl_fwd.h:22
T1 first_type
Definition: vbl_triple.h:19
vbl_triple(vbl_triple< U1, U2, U3 > const &that)
Definition: vbl_triple.h:34
vbl_triple< T1, T2, T3 > vbl_make_triple(T1 const &x, T2 const &y, T3 const &z)
Definition: vbl_triple.h:61
bool operator==(vbl_triple< T1, T2, T3 > const &x, vbl_triple< T1, T2, T3 > const &y)
Definition: vbl_triple.h:41
bool operator<(vbl_triple< T1, T2, T3 > const &x, vbl_triple< T1, T2, T3 > const &y)
Definition: vbl_triple.h:54
T3 third_type
Definition: vbl_triple.h:21
vbl_triple(T1 const &a, T2 const &b, T3 c)
Definition: vbl_triple.h:28
T2 second_type
Definition: vbl_triple.h:20
bool operator!=(vbl_triple< T1, T2, T3 > const &x, vbl_triple< T1, T2, T3 > const &y)
Definition: vbl_triple.h:50
vbl_triple()=default
std::istream & operator>>(std::istream &os, vbl_triple< T1, T2, T3 > &x)
Definition: vbl_triple.h:73