/*
 * Copyright (C) 2017 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 ANDROID_VINTF_DISABLED_CHECKS_H_
#define ANDROID_VINTF_DISABLED_CHECKS_H_

namespace android {
namespace vintf {

namespace CheckFlags {

// Flags for *::checkCompatibility functions.
class Type {
   public:
#define VINTF_CHECK_FLAGS_FIELD(name, bit)                                      \
    constexpr Type enable##name() const { return Type(mValue | (1 << bit)); }   \
    constexpr Type disable##name() const { return Type(mValue & ~(1 << bit)); } \
    constexpr bool is##name##Enabled() const { return mValue & (1 << bit); }

    VINTF_CHECK_FLAGS_FIELD(Avb, 0)
    VINTF_CHECK_FLAGS_FIELD(RuntimeInfo, 1)
    VINTF_CHECK_FLAGS_FIELD(Kernel, 2)
#undef VINTF_CHECK_FLAGS_FIELD

    explicit constexpr Type(int32_t value) : mValue(value) {}

   private:
    int32_t mValue;
};

constexpr Type ENABLE_ALL_CHECKS{~0};
constexpr Type DISABLE_ALL_CHECKS{0};
// Disable AVB version check in RuntimeInfo::checkCompatibility
constexpr Type DISABLE_AVB_CHECK = ENABLE_ALL_CHECKS.disableAvb();
// Disable RuntimeInfo <-> Framework Matrix check. This implies DISABLE_AVB_CHECK.
constexpr Type DISABLE_RUNTIME_INFO = ENABLE_ALL_CHECKS.disableRuntimeInfo();

// tests
static_assert(ENABLE_ALL_CHECKS.isAvbEnabled(), "");
static_assert(ENABLE_ALL_CHECKS.isRuntimeInfoEnabled(), "");
static_assert(!DISABLE_AVB_CHECK.isAvbEnabled(), "");
static_assert(DISABLE_AVB_CHECK.isRuntimeInfoEnabled(), "");
static_assert(DISABLE_RUNTIME_INFO.isAvbEnabled(), "");
static_assert(!DISABLE_RUNTIME_INFO.isRuntimeInfoEnabled(), "");

}  // namespace CheckFlags
}  // namespace vintf
}  // namespace android

#endif  // ANDROID_VINTF_DISABLED_CHECKS_H_
