// Copyright 2021 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.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/src/cmd/gen
// using the template:
//   src/tint/ast/interpolate_attribute.cc.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/ast/interpolate_attribute.h"

#include <string>

#include "src/tint/program_builder.h"

TINT_INSTANTIATE_TYPEINFO(tint::ast::InterpolateAttribute);

namespace tint::ast {

InterpolateAttribute::InterpolateAttribute(ProgramID pid,
                                           NodeID nid,
                                           const Source& src,
                                           InterpolationType ty,
                                           InterpolationSampling smpl)
    : Base(pid, nid, src), type(ty), sampling(smpl) {}

InterpolateAttribute::~InterpolateAttribute() = default;

std::string InterpolateAttribute::Name() const {
    return "interpolate";
}

const InterpolateAttribute* InterpolateAttribute::Clone(CloneContext* ctx) const {
    // Clone arguments outside of create() call to have deterministic ordering
    auto src = ctx->Clone(source);
    return ctx->dst->create<InterpolateAttribute>(src, type, sampling);
}

/// ParseInterpolationType parses a InterpolationType from a string.
/// @param str the string to parse
/// @returns the parsed enum, or InterpolationType::kUndefined if the string could not be parsed.
InterpolationType ParseInterpolationType(std::string_view str) {
    if (str == "flat") {
        return InterpolationType::kFlat;
    }
    if (str == "linear") {
        return InterpolationType::kLinear;
    }
    if (str == "perspective") {
        return InterpolationType::kPerspective;
    }
    return InterpolationType::kUndefined;
}

std::ostream& operator<<(std::ostream& out, InterpolationType value) {
    switch (value) {
        case InterpolationType::kUndefined:
            return out << "undefined";
        case InterpolationType::kFlat:
            return out << "flat";
        case InterpolationType::kLinear:
            return out << "linear";
        case InterpolationType::kPerspective:
            return out << "perspective";
    }
    return out << "<unknown>";
}

/// ParseInterpolationSampling parses a InterpolationSampling from a string.
/// @param str the string to parse
/// @returns the parsed enum, or InterpolationSampling::kUndefined if the string could not be
/// parsed.
InterpolationSampling ParseInterpolationSampling(std::string_view str) {
    if (str == "center") {
        return InterpolationSampling::kCenter;
    }
    if (str == "centroid") {
        return InterpolationSampling::kCentroid;
    }
    if (str == "sample") {
        return InterpolationSampling::kSample;
    }
    return InterpolationSampling::kUndefined;
}

std::ostream& operator<<(std::ostream& out, InterpolationSampling value) {
    switch (value) {
        case InterpolationSampling::kUndefined:
            return out << "undefined";
        case InterpolationSampling::kCenter:
            return out << "center";
        case InterpolationSampling::kCentroid:
            return out << "centroid";
        case InterpolationSampling::kSample:
            return out << "sample";
    }
    return out << "<unknown>";
}

}  // namespace tint::ast
