invalidationlevel.h 2.35 KB
Newer Older
schultezub's avatar
schultezub committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef INVALIDATIONLEVEL_H__
#define INVALIDATIONLEVEL_H__

namespace TUMVis {

    /**
     * Wrapper class for enum-int-based invalidation levels
     * Invalidation Level will internally be stored in an integer, the named levels define the bit mask.
     * All Accessor methods correctly apply the bitmasks.
     */
    struct InvalidationLevel {
    public:
        /**
         * Available invalidation levels
         */
        enum NamedLevels {
            VALID               = 0,
            INVALID_RESULT      = 1 << 0,
            INVALID_SHADER      = 1 << 1,
        };

        /**
         * Creates a new invalidation level.
         * \param defaultLevel  Initial invalidation level
         */
        InvalidationLevel(int defaultLevel = VALID) {
            _level = static_cast<int>(defaultLevel);
        }

        /**
         * Returns the invalidation level
         * \return _level
         */
        int getLevel() const {
            return _level;
        }

        /**
         * Returns wheter the invalidation level is valid.
         * \return _level == VALID
         */
        bool isValid() const {
            return _level == static_cast<int>(VALID);
        }

        bool isInvalidResult() const {
            return _level == static_cast<int>(INVALID_RESULT);
        }

        bool isInvalidShader() const {
            return _level == static_cast<int>(INVALID_SHADER);
        }


        void setValid() {
            _level = static_cast<int>(VALID);
        }

        /**
         * Update the invalidation level by \a level.
         * If \a level is VALID, the invalidation level will be set to VALID.
         * If \a level is one of the INVALID_X state, the corresponding flag will be set.
         * \param level     Invalidation level to apply.
         */
        void setLevel(int level) {
            if (level == static_cast<int>(VALID)) {
                _level = level;
            }
            else {
                _level |= static_cast<int>(level);
            }        
        }

        void setLevel(NamedLevels nl) {
            setLevel(static_cast<int>(nl));
        }

        void setLevel(InvalidationLevel il) {
            setLevel(il._level);
        }

    private:
        int _level;
    };

}

#endif // INVALIDATIONLEVEL_H__