2 * Copyright (C) 2015 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef ART_RUNTIME_EXPERIMENTAL_FLAGS_H_
18 #define ART_RUNTIME_EXPERIMENTAL_FLAGS_H_
24 // Possible experimental features that might be enabled.
25 struct ExperimentalFlags {
26 // The actual flag values.
32 constexpr ExperimentalFlags() : value_(0x0000) {}
33 constexpr ExperimentalFlags(decltype(kNone) t) : value_(static_cast<uint32_t>(t)) {}
35 constexpr operator decltype(kNone)() const {
36 return static_cast<decltype(kNone)>(value_);
39 constexpr explicit operator bool() const {
40 return value_ != kNone;
43 constexpr ExperimentalFlags operator|(const decltype(kNone)& b) const {
44 return static_cast<decltype(kNone)>(value_ | static_cast<uint32_t>(b));
46 constexpr ExperimentalFlags operator|(const ExperimentalFlags& b) const {
47 return static_cast<decltype(kNone)>(value_ | b.value_);
50 constexpr ExperimentalFlags operator&(const ExperimentalFlags& b) const {
51 return static_cast<decltype(kNone)>(value_ & b.value_);
53 constexpr ExperimentalFlags operator&(const decltype(kNone)& b) const {
54 return static_cast<decltype(kNone)>(value_ & static_cast<uint32_t>(b));
57 constexpr bool operator==(const ExperimentalFlags& b) const {
58 return value_ == b.value_;
65 inline std::ostream& operator<<(std::ostream& stream, const ExperimentalFlags& e) {
67 if (e & ExperimentalFlags::kLambdas) {
68 stream << (started ? "|" : "") << "kLambdas";
77 inline std::ostream& operator<<(std::ostream& stream, const decltype(ExperimentalFlags::kNone)& e) {
78 return stream << ExperimentalFlags(e);
83 #endif // ART_RUNTIME_EXPERIMENTAL_FLAGS_H_