File tree Expand file tree Collapse file tree 1 file changed +28
-0
lines changed
cpp/common/src/codingstandards/cpp Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Original file line number Diff line number Diff line change @@ -59,3 +59,31 @@ Type stripSpecifiers(Type type) {
59
59
then result = stripSpecifiers ( type .( SpecifiedType ) .getBaseType ( ) )
60
60
else result = type
61
61
}
62
+
63
+ /**
64
+ * A type that implements the BitmaskType trait.
65
+ * https://en.cppreference.com/w/cpp/named_req/BitmaskType
66
+ */
67
+ abstract class BitmaskType extends Type { }
68
+
69
+ /**
70
+ * Holds if `enum` implements required overload `overload` to implement
71
+ * the BitmaskType trait.
72
+ */
73
+ private predicate isRequiredEnumOverload ( Enum enum , Function overload ) {
74
+ overload .getName ( ) .regexpMatch ( "operator([&|^~]|&=|\\|=)" ) and
75
+ forex ( Parameter p | p = overload .getAParameter ( ) |
76
+ (
77
+ p .getType ( ) = enum
78
+ or
79
+ p .getType ( ) .( ReferenceType ) .getBaseType ( ) = enum
80
+ )
81
+ )
82
+ }
83
+
84
+ private class EnumBitmaskType extends BitmaskType , Enum {
85
+ EnumBitmaskType ( ) {
86
+ // Implements all the required overload
87
+ count ( Function overload | isRequiredEnumOverload ( this , overload ) ) = 6
88
+ }
89
+ }
You can’t perform that action at this time.
0 commit comments