1 /*
2 This file is part of LilyPond, the GNU music typesetter.
3
4 Copyright (C) 1997--2020 Han-Wen Nienhuys <hanwen@xs4all.nl>
5
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef DIRECTION_HH
21 #define DIRECTION_HH
22
23 #include <algorithm>
24 #include "axis.hh"
25
26 enum Direction
27 {
28 UP = 1,
29 DOWN = -1,
30 LEFT = -1,
31 RIGHT = 1,
32 MIN = -1,
33 MAX = 1,
34 CENTER = 0,
35 SMALLER = -1,
36 BIGGER = 1,
37 START = -1,
38 STOP = 1,
39
40 /*
41 This is necessary to safely write loops,
42 since
43
44 dir <= RIGHT
45
46 is otherwise transformed into true unconditionally.
47 */
48 DIRECTION_LIMIT = 2,
49 DIRECTION_NEG_LIMIT = -2,
50 };
51
52 inline Direction
operator -(Direction d)53 operator - (Direction d)
54 {
55 return Direction (- static_cast<int> (d)); // cast avoids recursion
56 }
57
58 #define UP_and_DOWN(d) \
59 Direction d = UP; d != CENTER; d = (d == UP ? DOWN : CENTER)
60
61 #define DOWN_and_UP(d) \
62 Direction d = DOWN; d != CENTER; d = (d == DOWN ? UP : CENTER)
63
64 #define LEFT_and_RIGHT(d) \
65 Direction d = LEFT; d != CENTER; d = (d == LEFT ? RIGHT : CENTER)
66
67 /**
68 if d > 0: the max operator
69 if d < 0: the min operator
70 */
minmax(Direction d,T a,T b)71 template<class T> T minmax (Direction d, T a, T b)
72 {
73 if (d == UP)
74 return std::max (a, b);
75 else
76 return std::min (a, b);
77 }
78
79 #endif // DIRECTION_HH
80