invalidationlevel.h 2.36 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
#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 {
schultezub's avatar
schultezub committed
47
            return (_level & static_cast<int>(INVALID_RESULT)) != 0;
schultezub's avatar
schultezub committed
48
49
50
        }

        bool isInvalidShader() const {
schultezub's avatar
schultezub committed
51
            return (_level & static_cast<int>(INVALID_SHADER)) != 0;
schultezub's avatar
schultezub committed
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
        }


        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__