/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SKSL_FLOATLITERAL
#define SKSL_FLOATLITERAL

#include "src/sksl/SkSLContext.h"
#include "src/sksl/ir/SkSLExpression.h"

namespace SkSL {

/**
 * A literal floating point number. These are generally referred to as FloatLiteral, but
 * Literal<SKSL_FLOAT> is also available for use with template code.
 */
template <typename T> class Literal;
using FloatLiteral = Literal<SKSL_FLOAT>;

template <>
class Literal<SKSL_FLOAT> final : public Expression {
public:
    static constexpr Kind kExpressionKind = Kind::kFloatLiteral;

    Literal(int offset, float value, const Type* type)
        : INHERITED(offset, kExpressionKind, type)
        , fValue(value) {}

    // Makes a literal of $floatLiteral type.
    static std::unique_ptr<FloatLiteral> Make(const Context& context, int offset, float value) {
        return std::make_unique<FloatLiteral>(offset, value, context.fTypes.fFloatLiteral.get());
    }

    // Makes a literal of the specified floating-point type.
    static std::unique_ptr<FloatLiteral> Make(int offset, float value, const Type* type) {
        SkASSERT(type->isFloat());
        return std::make_unique<FloatLiteral>(offset, value, type);
    }

    float value() const {
        return fValue;
    }

    String description() const override {
        return to_string(this->value());
    }

    bool hasProperty(Property property) const override {
        return false;
    }

    bool isCompileTimeConstant() const override {
        return true;
    }

    CoercionCost coercionCost(const Type& target) const override {
        if (target.isFloat()) {
            return CoercionCost::Free();
        }
        return INHERITED::coercionCost(target);
    }

    ComparisonResult compareConstant(const Expression& other) const override {
        if (!other.is<FloatLiteral>()) {
            return ComparisonResult::kUnknown;
        }
        return this->value() == other.as<FloatLiteral>().value() ? ComparisonResult::kEqual
                                                                 : ComparisonResult::kNotEqual;
    }

    std::unique_ptr<Expression> clone() const override {
        return std::make_unique<FloatLiteral>(fOffset, this->value(), &this->type());
    }

    const Expression* getConstantSubexpression(int n) const override {
        SkASSERT(n == 0);
        return this;
    }

private:
    float fValue;

    using INHERITED = Expression;
};

}  // namespace SkSL

#endif
