// Copyright 2022 The Tint Authors.
//
// 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 SRC_TINT_CONSTANT_CONSTANT_H_
#define SRC_TINT_CONSTANT_CONSTANT_H_

#include <variant>

#include "src/tint/castable.h"
#include "src/tint/constant/node.h"
#include "src/tint/number.h"
#include "src/tint/type/type.h"

namespace tint::constant {

/// Constant is the interface to a compile-time evaluated expression value.
class Constant : public Castable<Constant, Node> {
  public:
    /// Constructor
    Constant();

    /// Destructor
    ~Constant() override;

    /// @returns the type of the constant
    virtual const type::Type* Type() const = 0;

    /// @returns the value of this Constant, if this constant is of a scalar value or abstract
    /// numeric, otherwise std::monostate.
    virtual std::variant<std::monostate, AInt, AFloat> Value() const = 0;

    /// @returns the child constant element with the given index, or nullptr if the constant has no
    /// children, or the index is out of bounds.
    /// For arrays, this returns the i'th element of the array.
    /// For vectors, this returns the i'th element of the vector.
    /// For matrices, this returns the i'th column vector of the matrix.
    /// For structures, this returns the i'th member field of the structure.
    virtual const Constant* Index(size_t) const = 0;

    /// @returns true if child elements of this constant are positive-zero valued.
    virtual bool AllZero() const = 0;

    /// @returns true if any child elements of this constant are positive-zero valued.
    virtual bool AnyZero() const = 0;

    /// @returns true if all child elements of this constant have the same value and type.
    virtual bool AllEqual() const = 0;

    /// @returns a hash of the constant.
    virtual size_t Hash() const = 0;

    /// @returns the value of the constant as the given scalar or abstract value.
    template <typename T>
    T ValueAs() const {
        return std::visit(
            [](auto v) {
                if constexpr (std::is_same_v<decltype(v), std::monostate>) {
                    return T(0);
                } else {
                    return static_cast<T>(v);
                }
            },
            Value());
    }
};

}  // namespace tint::constant

#endif  // SRC_TINT_CONSTANT_CONSTANT_H_
