Proto  3.2
Proto_Face.H
Go to the documentation of this file.
1 #ifndef _Proto_LOHISIDE_H_
2 #define _Proto_LOHISIDE_H_
3 
4 namespace Proto
5 {
6  /*
7  TODO: I have no clue what the "Side" class is doing aside from obfuscating syntax.
8  This file should contain a Side enum, a couple namespace functions, and SideIterator.
9  I'm not changing this because of Chombo4 dependence -CLG
10  */
11 
12  // forward declarations
13  class SideIterator;
14 
15  /// Side
16  /**
17  Abstraction for high / low side of a grid cell.
18  */
19  class Side
20  {
21  public:
22  /// Side Enum
23  enum LoHiSide
24  {
25  Invalid=-1, ///< Invalid
26  Lo=0, ///< Low side; normal is in negative coordinate direction
27  Hi, ///< High side; normal is in the positive coordinate direction
28  NUMSIDES ///< Number of sides
29  };
30 
31  /// Constructor
32  Side() {}
33 
34  /// Destructor
35  ~Side() {}
36 
37  /// Get Begin Iterator
38  inline static SideIterator begin();
39 
40  /// Get End Iterator
41  inline static SideIterator end();
42  };
43 
44  /// Flip Side
45  /**
46  Utility function for flipping between Side::Lo and Side::Hi
47 
48  \param a_side Side::Lo or Side::Hi
49  */
50  inline Side::LoHiSide flip(const Side::LoHiSide& a_side) { return (a_side == Side::Lo) ? Side::Hi : Side::Lo; }
51 
52  /// Sign
53  /**
54  Converts a Side to +1 (Hi) or -1 (Lo);
55  */
56  inline int sign(const Side::LoHiSide& a_side) { return (a_side == Side::Lo) ? -1 : 1; }
57 
58  /// Side Iterator
59  /**
60  Convenience iterator to allow iteration through Lo, Hi.
61  */
63  {
64  public:
65  /// Constructor
66  SideIterator(int a_start = 0) { m_current = a_start; }
67 
68  /// Destructor
70 
71  /// Begin
72  /**
73  Set the iterator to the first side.
74  */
75  inline void begin() { m_current = 0; }
76 
77  /// Increment
78  /**
79  Advance the iterator to the next face.
80  */
81  inline void operator++() { ++m_current; }
82 
83  /// Equality Operator
84  inline bool operator==(const SideIterator& a_iter) { return m_current == a_iter.m_current; }
85 
86  /// Inequality Operator
87  inline bool operator!=(const SideIterator& a_iter) { return m_current != a_iter.m_current; }
88 
89  /// Dereference
90  inline Side::LoHiSide operator*() { return this->operator()(); }
91 
92  /// Get Value
93  /**
94  Returns the current Side
95  */
96  inline Side::LoHiSide operator () () const
97  {
98  switch (m_current)
99  {
100  case 0:
101  return Side::Lo;
102  case 1:
103  return Side::Hi;
104  default:
105  return Side::Invalid;
106  }
107  }
108 
109  /// Continue Query
110  /**
111  Returns <tt>true</tt> if there is a next side, <tt>false</tt> if not.
112  */
113  inline bool ok() const { return ((m_current > -1) && (m_current < Side::NUMSIDES)); }
114 
115  private:
117  };
118 
121 
122  struct Face
123  {
124  public:
125  inline Face(const Face& a_face) : dir(a_face.dir), side(a_face.side) {}
126  inline Face(int a_dir, Side::LoHiSide a_side) : dir(a_dir), side(a_side) {}
127  inline Face operator-() const
128  {
129  return Face(dir, (side == Side::Lo) ? Side::Hi : Side::Lo);
130  }
131  inline int sign() const { return (side == Side::Hi ? 1 : -1); }
132  const int dir;
134  };
135 
136 }
137 #endif
Face(const Face &a_face)
Definition: Proto_Face.H:125
Definition: Proto_Face.H:122
void begin()
Begin.
Definition: Proto_Face.H:75
LoHiSide
Side Enum.
Definition: Proto_Face.H:23
Low side; normal is in negative coordinate direction.
Definition: Proto_Face.H:26
Invalid.
Definition: Proto_Face.H:25
Side::LoHiSide flip(const Side::LoHiSide &a_side)
Flip Side.
Definition: Proto_Face.H:50
SideIterator(int a_start=0)
Constructor.
Definition: Proto_Face.H:66
Side::LoHiSide operator*()
Dereference.
Definition: Proto_Face.H:90
int sign(const Side::LoHiSide &a_side)
Sign.
Definition: Proto_Face.H:56
const int dir
Definition: Proto_Face.H:132
~SideIterator()
Destructor.
Definition: Proto_Face.H:69
bool operator==(const SideIterator &a_iter)
Equality Operator.
Definition: Proto_Face.H:84
const Side::LoHiSide side
Definition: Proto_Face.H:133
Number of sides.
Definition: Proto_Face.H:28
~Side()
Destructor.
Definition: Proto_Face.H:35
int sign() const
Definition: Proto_Face.H:131
Definition: Proto_Array.H:17
void operator++()
Increment.
Definition: Proto_Face.H:81
static SideIterator end()
Get End Iterator.
Definition: Proto_Face.H:120
Side()
Constructor.
Definition: Proto_Face.H:32
bool operator!=(const SideIterator &a_iter)
Inequality Operator.
Definition: Proto_Face.H:87
bool ok() const
Continue Query.
Definition: Proto_Face.H:113
int m_current
Definition: Proto_Face.H:116
static SideIterator begin()
Get Begin Iterator.
Definition: Proto_Face.H:119
Point dir
Definition: Proto_MBBoxPartition.H:16
Face(int a_dir, Side::LoHiSide a_side)
Definition: Proto_Face.H:126
Side.
Definition: Proto_Face.H:19
High side; normal is in the positive coordinate direction.
Definition: Proto_Face.H:27
Face operator-() const
Definition: Proto_Face.H:127
Side Iterator.
Definition: Proto_Face.H:62