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

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

namespace tint::ast {

std::ostream& operator<<(std::ostream& out, Builtin builtin) {
    switch (builtin) {
        case Builtin::kNone: {
            out << "none";
            break;
        }
        case Builtin::kPosition: {
            out << "position";
            break;
        }
        case Builtin::kVertexIndex: {
            out << "vertex_index";
            break;
        }
        case Builtin::kInstanceIndex: {
            out << "instance_index";
            break;
        }
        case Builtin::kFrontFacing: {
            out << "front_facing";
            break;
        }
        case Builtin::kFragDepth: {
            out << "frag_depth";
            break;
        }
        case Builtin::kLocalInvocationId: {
            out << "local_invocation_id";
            break;
        }
        case Builtin::kLocalInvocationIndex: {
            out << "local_invocation_index";
            break;
        }
        case Builtin::kGlobalInvocationId: {
            out << "global_invocation_id";
            break;
        }
        case Builtin::kWorkgroupId: {
            out << "workgroup_id";
            break;
        }
        case Builtin::kNumWorkgroups: {
            out << "num_workgroups";
            break;
        }
        case Builtin::kSampleIndex: {
            out << "sample_index";
            break;
        }
        case Builtin::kSampleMask: {
            out << "sample_mask";
            break;
        }
        case Builtin::kPointSize: {
            out << "pointsize";
        }
    }
    return out;
}

}  // namespace tint::ast
