diff options
Diffstat (limited to 'runtime/experimental_flags.h')
| -rw-r--r-- | runtime/experimental_flags.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/runtime/experimental_flags.h b/runtime/experimental_flags.h new file mode 100644 index 0000000000..2e674e95c6 --- /dev/null +++ b/runtime/experimental_flags.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_EXPERIMENTAL_FLAGS_H_ +#define ART_RUNTIME_EXPERIMENTAL_FLAGS_H_ + +#include <ostream> + +namespace art { + +// Possible experimental features that might be enabled. +struct ExperimentalFlags { + // The actual flag values. + enum { + kNone = 0x0000, + kLambdas = 0x0001, + kDefaultMethods = 0x0002, + }; + + constexpr ExperimentalFlags() : value_(0x0000) {} + constexpr ExperimentalFlags(decltype(kNone) t) : value_(static_cast<uint32_t>(t)) {} + + constexpr operator decltype(kNone)() const { + return static_cast<decltype(kNone)>(value_); + } + + constexpr explicit operator bool() const { + return value_ != kNone; + } + + constexpr ExperimentalFlags operator|(const decltype(kNone)& b) const { + return static_cast<decltype(kNone)>(value_ | static_cast<uint32_t>(b)); + } + constexpr ExperimentalFlags operator|(const ExperimentalFlags& b) const { + return static_cast<decltype(kNone)>(value_ | b.value_); + } + + constexpr ExperimentalFlags operator&(const ExperimentalFlags& b) const { + return static_cast<decltype(kNone)>(value_ & b.value_); + } + constexpr ExperimentalFlags operator&(const decltype(kNone)& b) const { + return static_cast<decltype(kNone)>(value_ & static_cast<uint32_t>(b)); + } + + constexpr bool operator==(const ExperimentalFlags& b) const { + return value_ == b.value_; + } + + private: + uint32_t value_; +}; + +inline std::ostream& operator<<(std::ostream& stream, const ExperimentalFlags& e) { + bool started = false; + if (e & ExperimentalFlags::kLambdas) { + stream << (started ? "|" : "") << "kLambdas"; + started = true; + } + if (e & ExperimentalFlags::kDefaultMethods) { + stream << (started ? "|" : "") << "kDefaultMethods"; + started = true; + } + if (!started) { + stream << "kNone"; + } + return stream; +} + +inline std::ostream& operator<<(std::ostream& stream, const decltype(ExperimentalFlags::kNone)& e) { + return stream << ExperimentalFlags(e); +} + +} // namespace art + +#endif // ART_RUNTIME_EXPERIMENTAL_FLAGS_H_ |