MeshLib C++ Docs
Loading...
Searching...
No Matches
MRViewportId.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMeshFwd.h"
4#include <cassert>
5
6namespace MR
7{
8
12
16{
17public:
18 ViewportId() noexcept = default;
19 explicit constexpr ViewportId( unsigned i ) noexcept : id_( i ) { }
20
21 constexpr unsigned value() const { return id_; }
22 bool valid() const { return id_ > 0; }
23 explicit operator bool() const { return id_ > 0; }
24
25 bool operator == ( ViewportId b ) const { return id_ == b.id_; }
26 bool operator != ( ViewportId b ) const { return id_ != b.id_; }
27 bool operator < ( ViewportId b ) const { return id_ < b.id_; }
28
29 ViewportId next() const { return ViewportId{ id_ << 1 }; }
30 ViewportId prev() const { return ViewportId{ id_ >> 1 }; }
31
32// Allocating IDs on the heap in C is insufferable, so instead we bind them as single-member structs (via `--expose-as-struct`).
33// But since our parser only tracks public members, we have to make it public for C.
34#if !MR_PARSING_FOR_C_BINDINGS && !MR_COMPILING_C_BINDINGS
35private:
36#endif
37 unsigned id_ = 0;
38};
39
42{
43public:
44 ViewportMask() noexcept = default;
45 explicit constexpr ViewportMask( unsigned i ) noexcept : mask_( i ) { }
46 constexpr ViewportMask( ViewportId i ) noexcept : mask_( i.value() ) { }
47
49 static ViewportMask all() { return ViewportMask{ ~0u }; }
50 static ViewportMask any() { return ViewportMask{ ~0u }; }
51
52 constexpr unsigned value() const { return mask_; }
53 constexpr bool empty() const { return mask_ == 0; }
54 bool contains( ViewportId id ) const { assert( id.valid() ); return ( mask_ & id.value() ) != 0; }
55
56 bool operator == ( ViewportMask b ) const { return mask_ == b.mask_; }
57 bool operator != ( ViewportMask b ) const { return mask_ != b.mask_; }
58 bool operator < ( ViewportMask b ) const { return mask_ < b.mask_; }
59
60 ViewportMask operator~() const { ViewportMask res; res.mask_ = ~mask_; return res; }
61
62 ViewportMask & operator &= ( ViewportMask b ) { mask_ &= b.mask_; return * this; }
63 ViewportMask & operator |= ( ViewportMask b ) { mask_ |= b.mask_; return * this; }
64 ViewportMask & operator ^= ( ViewportMask b ) { mask_ ^= b.mask_; return * this; }
65
66 void set( ViewportId id, bool on = true ) { on ? ( mask_ |= id.value() ) : ( mask_ &= ~id.value() ); }
67
68// Allocating IDs/masks on the heap in C is insufferable, so instead we bind them as single-member structs (via `--expose-as-struct`).
69// But since our parser only tracks public members, we have to make it public for C.
70#if !MR_PARSING_FOR_C_BINDINGS && !MR_COMPILING_C_BINDINGS
71private:
72#endif
73 unsigned mask_ = 0;
74};
75
76inline ViewportMask operator & ( ViewportMask a, ViewportMask b ) { a &= b; return a; }
77inline ViewportMask operator | ( ViewportMask a, ViewportMask b ) { a |= b; return a; }
78inline ViewportMask operator ^ ( ViewportMask a, ViewportMask b ) { a ^= b; return a; }
79
82{
83public:
84 using iterator_category = std::forward_iterator_tag;
86
88 ViewportIterator() = default;
91 : mask_( mask )
92 {
93 findFirst_();
94 }
96 {
97 findNext_();
98 return * this;
99 }
100 ViewportMask mask() const { return mask_; }
101 ViewportId operator *() const { return id_; }
102
103private:
104 void findFirst_()
105 {
106 id_ = ViewportId{1};
107 for( ; id_.valid() && !mask_.contains( id_ ); id_ = id_.next() );
108 }
109 void findNext_()
110 {
111 assert( id_.valid() );
112 for( id_ = id_.next(); id_.valid() && !mask_.contains( id_ ); id_ = id_.next() );
113 }
114
115 ViewportId id_{0};
116 ViewportMask mask_{0};
117};
118
119inline bool operator ==( const ViewportIterator & a, const ViewportIterator & b )
120 { return *a == *b; }
121
122inline auto begin( ViewportMask mask )
123 { return ViewportIterator( mask ); }
124inline auto end( ViewportMask )
125 { return ViewportIterator(); }
126
128
129} // namespace MR
Definition MRViewportId.h:16
ViewportId next() const
Definition MRViewportId.h:29
ViewportId() noexcept=default
bool operator!=(ViewportId b) const
Definition MRViewportId.h:26
bool valid() const
Definition MRViewportId.h:22
bool operator<(ViewportId b) const
Definition MRViewportId.h:27
constexpr unsigned value() const
Definition MRViewportId.h:21
bool operator==(ViewportId b) const
Definition MRViewportId.h:25
ViewportId prev() const
Definition MRViewportId.h:30
iterates over all ViewportIds in given ViewportMask
Definition MRViewportId.h:82
ViewportIterator()=default
constructs end iterator
ViewportMask mask() const
Definition MRViewportId.h:100
ViewportIterator & operator++()
Definition MRViewportId.h:95
ViewportId operator*() const
Definition MRViewportId.h:101
ViewportIterator(ViewportMask mask)
constructs begin iterator
Definition MRViewportId.h:90
std::forward_iterator_tag iterator_category
Definition MRViewportId.h:84
stores mask of viewport unique identifiers
Definition MRViewportId.h:42
static ViewportMask any()
Definition MRViewportId.h:50
ViewportMask & operator&=(ViewportMask b)
Definition MRViewportId.h:62
bool contains(ViewportId id) const
Definition MRViewportId.h:54
ViewportMask & operator^=(ViewportMask b)
Definition MRViewportId.h:64
ViewportMask & operator|=(ViewportMask b)
Definition MRViewportId.h:63
ViewportMask operator~() const
Definition MRViewportId.h:60
bool operator==(ViewportMask b) const
Definition MRViewportId.h:56
void set(ViewportId id, bool on=true)
Definition MRViewportId.h:66
static ViewportMask all()
mask meaning all or any viewports
Definition MRViewportId.h:49
constexpr ViewportMask(ViewportId i) noexcept
Definition MRViewportId.h:46
bool operator<(ViewportMask b) const
Definition MRViewportId.h:58
ViewportMask() noexcept=default
bool operator!=(ViewportMask b) const
Definition MRViewportId.h:57
constexpr bool empty() const
Definition MRViewportId.h:53
constexpr unsigned value() const
Definition MRViewportId.h:52
MR_BIND_IGNORE auto begin(const BitSet &a)
Definition MRMesh/MRBitSet.h:308
MRMESH_API bool operator==(const BitSet &a, const BitSet &b)
compare that two bit sets have the same set bits (they can be equal even if sizes are distinct but la...
BitSet operator&(const BitSet &a, const BitSet &b)
Definition MRMesh/MRBitSet.h:367
BitSet operator|(const BitSet &a, const BitSet &b)
Definition MRMesh/MRBitSet.h:368
MR_BIND_IGNORE auto end(const BitSet &)
Definition MRMesh/MRBitSet.h:310
BitSet operator^(const BitSet &a, const BitSet &b)
Definition MRMesh/MRBitSet.h:369
Definition MRCameraOrientationPlugin.h:8