]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/direction.hh
de13ef4ca8a6341ea7ce843f22fdc76e00f982bb
[lilypond.git] / flower / include / direction.hh
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 1997--2015 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 "axis.hh"
24
25 enum Direction
26 {
27   UP = 1,
28   DOWN = -1,
29   LEFT = -1,
30   RIGHT = 1,
31   MIN = -1,
32   MAX = 1,
33   CENTER = 0,
34   SMALLER = -1,
35   BIGGER = 1,
36   START = -1,
37   STOP = 1,
38
39   /*
40     This is necessary to safely write loops,
41     since
42
43     dir <= RIGHT
44
45     is otherwise transformed into true unconditionally.
46   */
47   DIRECTION_LIMIT = 2,
48   DIRECTION_NEG_LIMIT = -2,
49 };
50
51 inline Direction
52 operator - (Direction d)
53 {
54   return Direction (- static_cast<int> (d)); // cast avoids recursion
55 }
56
57 #define UP_and_DOWN(d) \
58   Direction d = UP; d != CENTER; d = (d == UP ? DOWN : CENTER)
59
60 #define DOWN_and_UP(d) \
61   Direction d = DOWN; d != CENTER; d = (d == DOWN ? UP : CENTER)
62
63 #define LEFT_and_RIGHT(d) \
64   Direction d = LEFT; d != CENTER; d = (d == LEFT ? RIGHT : CENTER)
65
66 /**
67    if d > 0: the max operator
68    if d < 0: the min operator
69 */
70 template<class T> T minmax (Direction d, T a, T b)
71 {
72   if (d == UP)
73     return max (a, b);
74   else
75     return min (a, b);
76 }
77
78 #endif // DIRECTION_HH