// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_WASM_WASM_FEATURES_H_
#define V8_WASM_WASM_FEATURES_H_

// The feature flags are declared in their own header.
#include "src/base/enum-set.h"
#include "src/base/macros.h"
#include "src/wasm/wasm-feature-flags.h"

// All features, including features that do not have flags.
#define FOREACH_WASM_FEATURE FOREACH_WASM_FEATURE_FLAG

namespace v8 {
namespace internal {

class Isolate;

namespace wasm {

enum WasmFeature {
#define DECL_FEATURE_ENUM(feat, ...) kFeature_##feat,
  FOREACH_WASM_FEATURE(DECL_FEATURE_ENUM)
#undef DECL_FEATURE_ENUM
};

// Enabled or detected features.
class WasmFeatures : public base::EnumSet<WasmFeature> {
 public:
  constexpr WasmFeatures() = default;
  explicit constexpr WasmFeatures(std::initializer_list<WasmFeature> features)
      : EnumSet(features) {}

  // Simplified getters. Use {has_foo()} instead of {contains(kFeature_foo)}.
#define DECL_FEATURE_GETTER(feat, ...) \
  bool has_##feat() const { return contains(kFeature_##feat); }
  FOREACH_WASM_FEATURE(DECL_FEATURE_GETTER)
#undef DECL_FEATURE_GETTER

  static constexpr const char* name_for_feature(WasmFeature feature) {
    switch (feature) {
#define NAME(feat, ...)              \
  case WasmFeature::kFeature_##feat: \
    return #feat;
      FOREACH_WASM_FEATURE(NAME)
    }
#undef NAME
  }
  static inline constexpr WasmFeatures All();
  static inline constexpr WasmFeatures None();
  static inline constexpr WasmFeatures ForAsmjs();
  static WasmFeatures FromFlags();
  static V8_EXPORT_PRIVATE WasmFeatures FromIsolate(Isolate*);
};

// static
constexpr WasmFeatures WasmFeatures::All() {
#define LIST_FEATURE(feat, ...) kFeature_##feat,
  return WasmFeatures({FOREACH_WASM_FEATURE(LIST_FEATURE)});
#undef LIST_FEATURE
}

// static
constexpr WasmFeatures WasmFeatures::None() { return {}; }

// static
constexpr WasmFeatures WasmFeatures::ForAsmjs() { return {}; }

}  // namespace wasm
}  // namespace internal
}  // namespace v8

#endif  // V8_WASM_WASM_FEATURES_H_
