/*
 * Copyright 2010-2015 JetBrains s.r.o.
 *
 * 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.
 */

package org.jetbrains.kotlin.generators.builtins.arrays

import org.jetbrains.kotlin.generators.builtins.PrimitiveType
import org.jetbrains.kotlin.generators.builtins.generateBuiltIns.BuiltInsSourceGenerator
import java.io.PrintWriter

class GenerateArrays(out: PrintWriter) : BuiltInsSourceGenerator(out) {
    override fun getPackage() = "kotlin"

    override fun generateBody() {
        for (kind in PrimitiveType.values()) {
            val typeLower = kind.name.lowercase()
            val s = kind.capitalized
            val defaultValue = when (kind) {
                PrimitiveType.CHAR -> "null char (`\\u0000')"
                PrimitiveType.BOOLEAN -> "`false`"
                else -> "zero"
            }
            out.println("/**")
            out.println(" * An array of ${typeLower}s. When targeting the JVM, instances of this class are represented as `$typeLower[]`.")
            out.println(" * @constructor Creates a new array of the specified [size], with all elements initialized to $defaultValue.")
            out.println(" * @throws RuntimeException if the specified [size] is negative.")
            out.println(" */")
            out.println("public class ${s}Array(size: Int) {")
            out.println("    /**")
            out.println("     * Creates a new array of the specified [size], where each element is calculated by calling the specified")
            out.println("     * [init] function.")
            out.println("     *")
            out.println("     * The function [init] is called for each array element sequentially starting from the first one.")
            out.println("     * It should return the value for an array element given its index.")
            out.println("     *")
            out.println("     * @throws RuntimeException if the specified [size] is negative.")
            out.println("     */")
            out.println("    public inline constructor(size: Int, init: (Int) -> $s)")
            out.println()
            out.println("    /**")
            out.println("     * Returns the array element at the given [index].  This method can be called using the index operator.")
            out.println("     *")
            out.println("     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS")
            out.println("     * where the behavior is unspecified.")
            out.println("     */")
            out.println("    public operator fun get(index: Int): $s")
            out.println()
            out.println("    /**")
            out.println("     * Sets the element at the given [index] to the given [value]. This method can be called using the index operator.")
            out.println("     *")
            out.println("     * If the [index] is out of bounds of this array, throws an [IndexOutOfBoundsException] except in Kotlin/JS")
            out.println("     * where the behavior is unspecified.")
            out.println("     */")
            out.println("    public operator fun set(index: Int, value: $s): Unit")
            out.println()
            out.println("    /** Returns the number of elements in the array. */")
            out.println("    public val size: Int")
            out.println()
            out.println("    /** Creates an iterator over the elements of the array. */")
            out.println("    public operator fun iterator(): ${s}Iterator")
            out.println("}")
            out.println()
        }
    }
}
