1c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong/*
2c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * Copyright (C) 2017 The Android Open Source Project
3c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong *
4c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * Licensed under the Apache License, Version 2.0 (the "License");
5c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * you may not use this file except in compliance with the License.
6c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * You may obtain a copy of the License at
7c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong *
8c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong *      http://www.apache.org/licenses/LICENSE-2.0
9c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong *
10c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * Unless required by applicable law or agreed to in writing, software
11c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * distributed under the License is distributed on an "AS IS" BASIS,
12c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * See the License for the specific language governing permissions and
14c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong * limitations under the License.
15c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong */
16c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
17c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
18c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#ifndef ANDROID_VINTF_ARCH_H
19c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#define ANDROID_VINTF_ARCH_H
20c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
21c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#include <stdint.h>
22c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#include <string>
23c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#include <array>
24c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
25c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hongnamespace android {
26c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hongnamespace vintf {
27c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
28c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hongenum class Arch : size_t {
29c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    ARCH_EMPTY = 0,
30c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    ARCH_32,
31c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    ARCH_64,
32c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    ARCH_32_64
33c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong};
34c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
35c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hongstatic const std::array<std::string, 4> gArchStrings = {
36c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    {
37c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong        "",
38c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong        "32",
39c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong        "64",
40c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong        "32+64",
41c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    }
42c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong};
43c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
44c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Honginline bool has32(Arch arch) {
45c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    return arch == Arch::ARCH_32 || arch == Arch::ARCH_32_64;
46c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong}
47c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
48c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Honginline bool has64(Arch arch) {
49c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong    return arch == Arch::ARCH_64 || arch == Arch::ARCH_32_64;
50c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong}
51c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
526a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Honginline constexpr Arch operator|(Arch lft, Arch rgt) {
536a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong    return static_cast<Arch>(static_cast<size_t>(lft) | static_cast<size_t>(rgt));
546a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong}
556a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hongstatic_assert((Arch::ARCH_32 | Arch::ARCH_64) == Arch::ARCH_32_64, "bad Arch::operator|");
566a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong
576a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Honginline Arch& operator|=(Arch& lft, Arch rgt) {
586a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong    return (lft = lft | rgt);
596a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong}
606a1a12fa16b7c34a130f393ef9923bf67fc02c3aYifan Hong
61c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong} // namespace vintf
62c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong} // namespace android
63c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong
64c54d32cb0b20308a0ecea7864016a2a5dc512f71Yifan Hong#endif // ANDROID_VINTF_ARCH_H
65