Reorganize stdlib-js sources specific to the current JS backend
Move kotlin-stdlib-js project and the sources specific to the current backend to 'stdlib/js-v1' directory, but leave sources that can be shared with the new IR backend in the common 'stdlib/js' location with exception for 'stdlib/js/src/generated', which is used exclusively for current backend. This simplifies sourceset configuration when building stdlib with the new backend.
This commit is contained in:
@@ -1 +0,0 @@
|
||||
node_modules
|
||||
@@ -1,9 +1,5 @@
|
||||
## Kotlin Standard Library for JS
|
||||
This directory contains shared sources of Kotlin/JS Standard Library for current and IR backends.
|
||||
|
||||
This module produces a `kotlin-stdlib-js` jar which contains all the Kotlin standard kotlin library code compiled to JavaScript.
|
||||
Note that `stdlib/js/src/generated` is not shared but used exclusively for current `js-v1` backend.
|
||||
|
||||
The tests of this module can be run and debugged inside any browser by opening the **web/index.html** file in this directory to run the test cases using [Mocha](https://mochajs.org/).
|
||||
|
||||
You should execute `installMocha` gradle task before running these tests to fetch the required Mocha dependency and `testClasses` task to compile test code.
|
||||
|
||||
These tests are also run during CI build with [Node.js plugin](https://github.com/srs/gradle-node-plugin).
|
||||
Kotlin/JS Standard Library module is moved to `libraries/stdlib/js-v1`.
|
||||
@@ -1,402 +0,0 @@
|
||||
plugins {
|
||||
id "com.moowork.node" version "1.2.0"
|
||||
}
|
||||
|
||||
description = 'Kotlin Standard Library for JS'
|
||||
|
||||
apply plugin: 'kotlin-platform-js'
|
||||
apply plugin: 'idea'
|
||||
|
||||
configureDist(project)
|
||||
configurePublishing(project)
|
||||
|
||||
|
||||
def builtinsSrcDir = "${buildDir}/builtin-sources"
|
||||
def builtinsSrcDir2 = "${buildDir}/builtin-sources-for-builtins"
|
||||
def commonSrcDir = "${projectDir}/../src/kotlin"
|
||||
def commonSrcDir2 = "${projectDir}/../common/src"
|
||||
def coroutinesExpJsSrcDir = "${rootDir}/libraries/stdlib/coroutines-experimental/js/src"
|
||||
|
||||
def builtinsDir = "${rootDir}/core/builtins"
|
||||
def unsignedCommonSrcDir = "${rootDir}/libraries/stdlib/unsigned/src"
|
||||
def experimentalSrcDir = "${rootDir}/libraries/stdlib/experimental"
|
||||
def experimentalJsModuleName = 'kotlin-experimental'
|
||||
def coroutinesJsModuleName = 'kotlin-stdlib-coroutines'
|
||||
def jsSrcDir = "src"
|
||||
def jsTestSrcDir = "test"
|
||||
def jsSrcJsDir = "${jsSrcDir}/js"
|
||||
def jsOutputFile = "${buildDir}/classes/kotlin.js"
|
||||
def jsOutputMetaFile = "${buildDir}/classes/kotlin.meta.js"
|
||||
|
||||
def kotlinTestJsOutputFile = "${project(':kotlin-test:kotlin-test-js').buildDir}/classes/main/kotlin-test.js"
|
||||
|
||||
// TODO: take from sourcesets' outputs
|
||||
def jsTestOutputFile = "${buildDir}/classes/kotlin/test/kotlin-stdlib-js_test.js"
|
||||
def kotlinTestJsTestOutputFile = "${project(':kotlin-test:kotlin-test-js').buildDir}/classes/kotlin/test/kotlin-test-js_test.js"
|
||||
|
||||
|
||||
sourceSets {
|
||||
builtins {
|
||||
kotlin {
|
||||
srcDir builtinsSrcDir2
|
||||
srcDir 'runtime'
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
kotlin {
|
||||
srcDir builtinsSrcDir
|
||||
srcDir jsSrcDir
|
||||
}
|
||||
}
|
||||
|
||||
experimental {
|
||||
if(!BuildPropertiesKt.getKotlinBuildProperties(project).inIdeaSync)
|
||||
kotlin {
|
||||
srcDir experimentalSrcDir
|
||||
}
|
||||
}
|
||||
|
||||
test {
|
||||
kotlin {
|
||||
srcDir jsTestSrcDir
|
||||
}
|
||||
}
|
||||
|
||||
coroutinesExperimental {
|
||||
kotlin {
|
||||
srcDir coroutinesExpJsSrcDir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
commonSources
|
||||
}
|
||||
dependencies {
|
||||
expectedBy project(":kotlin-stdlib-common")
|
||||
commonSources project(path: ":kotlin-stdlib-common", configuration: "sources")
|
||||
testCompile project(':kotlin-test:kotlin-test-js')
|
||||
coroutinesExperimentalCompile project.files { sourceSets.main.output.files }.builtBy(compileKotlin2Js)
|
||||
}
|
||||
|
||||
task prepareComparableSource(type: Copy) {
|
||||
doFirst {
|
||||
delete builtinsSrcDir2
|
||||
}
|
||||
from("${builtinsDir}/native/kotlin") {
|
||||
include "Comparable.kt"
|
||||
}
|
||||
into builtinsSrcDir2
|
||||
}
|
||||
|
||||
task prepareBuiltinsSources(type: Copy) {
|
||||
doFirst {
|
||||
delete builtinsSrcDir
|
||||
}
|
||||
from("${builtinsDir}/native/kotlin") {
|
||||
include "Iterator.kt"
|
||||
include "Collections.kt"
|
||||
include "CharSequence.kt"
|
||||
include "Annotation.kt"
|
||||
}
|
||||
from("${builtinsDir}/src/kotlin/") {
|
||||
include "annotation/Annotations.kt"
|
||||
include "Function.kt"
|
||||
include "Iterators.kt"
|
||||
include "Range.kt"
|
||||
include "Progressions.kt"
|
||||
include "ProgressionIterators.kt"
|
||||
include "Ranges.kt"
|
||||
include "internal/InternalAnnotations.kt"
|
||||
include "internal/progressionUtil.kt"
|
||||
include "reflect/**/*.kt"
|
||||
include "Unit.kt"
|
||||
}
|
||||
into builtinsSrcDir
|
||||
}
|
||||
|
||||
tasks.withType(org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile) {
|
||||
kotlinOptions {
|
||||
main = "noCall"
|
||||
moduleKind = "commonjs"
|
||||
freeCompilerArgs = [
|
||||
"-version",
|
||||
"-Xallow-kotlin-package",
|
||||
"-Xallow-result-return-type"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
compileBuiltinsKotlin2Js {
|
||||
dependsOn prepareComparableSource
|
||||
kotlinOptions {
|
||||
metaInfo = false
|
||||
outputFile = "${buildDir}/classes/builtins/kotlin.js"
|
||||
sourceMap = true
|
||||
sourceMapPrefix = "./"
|
||||
}
|
||||
}
|
||||
|
||||
compileKotlin2Js {
|
||||
dependsOn prepareBuiltinsSources
|
||||
kotlinOptions {
|
||||
outputFile = "${buildDir}/classes/main/kotlin.js"
|
||||
sourceMap = true
|
||||
sourceMapPrefix = "./"
|
||||
freeCompilerArgs += [
|
||||
"-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir, commonSrcDir2, unsignedCommonSrcDir].collect { file(it).absoluteFile }.join(File.pathSeparator),
|
||||
"-Xuse-experimental=kotlin.Experimental",
|
||||
"-Xuse-experimental=kotlin.ExperimentalMultiplatform",
|
||||
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
|
||||
"-XXLanguage:+InlineClasses"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
compileExperimentalKotlin2Js {
|
||||
dependsOn compileKotlin2Js
|
||||
kotlinOptions {
|
||||
languageVersion = "1.3"
|
||||
apiVersion = "1.3"
|
||||
outputFile = "${buildDir}/classes/experimental/${experimentalJsModuleName}.js"
|
||||
sourceMap = true
|
||||
sourceMapPrefix = "./"
|
||||
freeCompilerArgs += ["-source-map-base-dirs", [experimentalSrcDir].join(File.pathSeparator)]
|
||||
}
|
||||
}
|
||||
|
||||
compileCoroutinesExperimentalKotlin2Js {
|
||||
kotlinOptions {
|
||||
languageVersion = "1.3"
|
||||
apiVersion = "1.3"
|
||||
outputFile = "${buildDir}/classes/coroutinesExperimental/kotlin.js"
|
||||
sourceMap = true
|
||||
sourceMapPrefix = "./"
|
||||
freeCompilerArgs += [
|
||||
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
|
||||
"-Xuse-experimental=kotlin.Experimental",
|
||||
"-Xcoroutines=enable",
|
||||
"-XXLanguage:-ReleaseCoroutines"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
compileTestKotlin2Js {
|
||||
kotlinOptions {
|
||||
moduleKind = "umd"
|
||||
freeCompilerArgs += [
|
||||
"-Xuse-experimental=kotlin.ExperimentalUnsignedTypes"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
task compileJs(type: NoDebugJavaExec) {
|
||||
dependsOn compileBuiltinsKotlin2Js, compileKotlin2Js, compileExperimentalKotlin2Js, compileCoroutinesExperimentalKotlin2Js
|
||||
inputs.files(compileBuiltinsKotlin2Js.outputs.files)
|
||||
inputs.files(compileKotlin2Js.outputs.files)
|
||||
inputs.files(compileExperimentalKotlin2Js.outputs.files)
|
||||
inputs.files(compileCoroutinesExperimentalKotlin2Js.outputs.files)
|
||||
inputs.dir(jsSrcDir)
|
||||
outputs.file(jsOutputFile)
|
||||
outputs.file("${jsOutputFile}.map")
|
||||
|
||||
def inputFiles = fileTree(jsSrcJsDir) {
|
||||
include '**/*.js'
|
||||
}
|
||||
|
||||
main = "org.jetbrains.kotlin.cli.js.internal.JSStdlibLinker"
|
||||
doFirst {
|
||||
args = [jsOutputFile, rootDir, "$jsSrcDir/wrapper.js"] + inputFiles.collect { it.path }.sort() +
|
||||
(compileBuiltinsKotlin2Js.outputs.files.collect { it.path }.sort() +
|
||||
compileKotlin2Js.outputs.files.collect { it.path }.sort() +
|
||||
compileCoroutinesExperimentalKotlin2Js.outputs.files.collect { it.path }.sort() /* +
|
||||
compileExperimentalKotlin2Js.outputs.files.collect { it.path }.sort() */).findAll {
|
||||
it.endsWith(".js") && !it.endsWith(".meta.js")
|
||||
}
|
||||
}
|
||||
classpath = configurations.kotlinCompilerClasspath
|
||||
|
||||
doLast {
|
||||
ant.replaceregexp(
|
||||
file: jsOutputFile,
|
||||
match: "module.exports,\\s*require\\([^)]+\\)",
|
||||
replace: "",
|
||||
byline: "true", encoding: "UTF-8")
|
||||
ant.replaceregexp(
|
||||
file: jsOutputFile,
|
||||
match: "function\\s*\\(_,\\s*Kotlin\\)",
|
||||
replace: "function()",
|
||||
byline: "true", encoding: "UTF-8")
|
||||
ant.replaceregexp(
|
||||
file: jsOutputFile,
|
||||
match: "return\\s+_;",
|
||||
replace: "",
|
||||
byline: "true", encoding: "UTF-8")
|
||||
|
||||
def sourceMapFile = file("${jsOutputFile}.map")
|
||||
def sourceMap = new groovy.json.JsonSlurper().parseText(sourceMapFile.text)
|
||||
|
||||
def sourceMapBasePaths = [
|
||||
"./",
|
||||
"libraries/stdlib/js/src/js/",
|
||||
"libraries/stdlib/js/src/",
|
||||
]
|
||||
sourceMap.sources = sourceMap.sources.collect { sourcePath ->
|
||||
def prefixToRemove = sourceMapBasePaths.find { basePath -> sourcePath.startsWith(basePath) }
|
||||
if (prefixToRemove != null) sourcePath.substring(prefixToRemove.length()) else sourcePath
|
||||
}
|
||||
|
||||
def sourceMapSourcesBaseDirs = [jsSrcDir, jsSrcJsDir, builtinsSrcDir, commonSrcDir, commonSrcDir2, projectDir, experimentalSrcDir, unsignedCommonSrcDir]
|
||||
|
||||
sourceMap.sourcesContent = sourceMap.sources.collect { sourceName ->
|
||||
def text = sourceMapSourcesBaseDirs.collect { file("$it/$sourceName") }.find { it.exists() }?.text
|
||||
if (text == null) logger.warn("Sources missing for file $sourceName")
|
||||
text
|
||||
}
|
||||
|
||||
sourceMapFile.text = groovy.json.JsonOutput.toJson(sourceMap)
|
||||
|
||||
file(jsOutputMetaFile).text = file(compileKotlin2Js.outputFile.path.replaceAll('\\.js$', '.meta.js')).text +
|
||||
file(compileCoroutinesExperimentalKotlin2Js.outputFile.path.replaceAll('\\.js$', '.meta.js')).text /* +
|
||||
file(compileExperimentalKotlin2Js.outputFile.path.replaceAll('\\.js$', '.meta.js')).text
|
||||
.replaceFirst(experimentalJsModuleName, 'kotlin') */
|
||||
}
|
||||
}
|
||||
|
||||
classes.dependsOn compileJs
|
||||
|
||||
|
||||
jar {
|
||||
enabled false
|
||||
}
|
||||
|
||||
task mergedJar(type: Jar, dependsOn: compileJs) {
|
||||
classifier = null
|
||||
manifestAttributes(manifest, project, 'Main')
|
||||
|
||||
// TODO: Use standard implementation title after js stdlib detector becomes more flexible (KT-17655)
|
||||
Properties properties = new Properties()
|
||||
new File("${rootDir}/resources/kotlinManifest.properties").withInputStream {
|
||||
properties.load(it)
|
||||
}
|
||||
manifest.attributes 'Implementation-Title': properties."manifest.impl.title.kotlin.javascript.stdlib"
|
||||
|
||||
includeEmptyDirs false
|
||||
duplicatesStrategy DuplicatesStrategy.EXCLUDE
|
||||
from jsOutputFile
|
||||
from jsOutputMetaFile
|
||||
from "${jsOutputFile}.map"
|
||||
from sourceSets.main.output
|
||||
from sourceSets.experimental.output
|
||||
from("${buildDir}/classes/coroutinesExperimental/kotlin") {
|
||||
into coroutinesJsModuleName
|
||||
}
|
||||
exclude "${experimentalJsModuleName}.*"
|
||||
}
|
||||
|
||||
task sourcesJar(type: Jar, dependsOn: compileJs) {
|
||||
classifier = 'sources'
|
||||
includeEmptyDirs false
|
||||
from(sourceSets.builtins.allSource) {
|
||||
into 'kotlin'
|
||||
}
|
||||
from(sourceSets.main.allSource) {
|
||||
into 'kotlin'
|
||||
exclude '**/*.java'
|
||||
exclude 'org.w3c/**'
|
||||
exclude 'js/**'
|
||||
}
|
||||
from(sourceSets.main.allSource) {
|
||||
include 'org.w3c/**'
|
||||
}
|
||||
from(sourceSets.experimental.allSource) {
|
||||
into 'kotlin'
|
||||
}
|
||||
from(sourceSets.coroutinesExperimental.allSource) {
|
||||
into 'kotlin'
|
||||
}
|
||||
}
|
||||
|
||||
task distSourcesJar(type: Jar) {
|
||||
dependsOn(sourcesJar, configurations.commonSources)
|
||||
baseName = 'dist-kotlin-stdlib-js'
|
||||
version = null
|
||||
classifier = 'sources'
|
||||
duplicatesStrategy = DuplicatesStrategy.FAIL
|
||||
from zipTree(sourcesJar.outputs.files.singleFile)
|
||||
|
||||
from(zipTree(configurations.commonSources.singleFile)) {
|
||||
it.includeEmptyDirs = false
|
||||
exclude 'META-INF/*'
|
||||
into 'common'
|
||||
}
|
||||
|
||||
from(project(":kotlin-stdlib-common").sourceSets.coroutinesExperimental.allSource) {
|
||||
into 'kotlin'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
artifacts {
|
||||
runtime mergedJar
|
||||
archives mergedJar
|
||||
archives sourcesJar
|
||||
}
|
||||
|
||||
javadocJar()
|
||||
|
||||
task distJs(type: Copy) {
|
||||
from(compileJs)
|
||||
into "$distDir/js"
|
||||
}
|
||||
|
||||
dist {
|
||||
dependsOn distJs
|
||||
[mergedJar, distSourcesJar].forEach {
|
||||
rename("dist-", "")
|
||||
from(it)
|
||||
}
|
||||
}
|
||||
|
||||
node {
|
||||
download = true
|
||||
version = '8.9.4' // The default 6.9.1 has buggy hyperbolic functions implementation
|
||||
nodeModulesDir = buildDir
|
||||
}
|
||||
|
||||
// Otherwise Node ignores nodeModulesDir
|
||||
task deleteLegacyNodeModules(type: Delete) {
|
||||
delete "$projectDir/node_modules"
|
||||
}
|
||||
|
||||
task installMocha(type: NpmTask, dependsOn: [deleteLegacyNodeModules]) {
|
||||
args = ['install', 'mocha']
|
||||
}
|
||||
|
||||
task installTeamcityReporter(type: NpmTask, dependsOn: [deleteLegacyNodeModules]) {
|
||||
args = ['install', 'mocha-teamcity-reporter']
|
||||
}
|
||||
|
||||
task runMocha(type: NodeTask, dependsOn: [testClasses, installMocha, ':kotlin-test:kotlin-test-js:testClasses']) {
|
||||
script = file("${buildDir}/node_modules/mocha/bin/mocha")
|
||||
|
||||
if (project.hasProperty("teamcity")) {
|
||||
dependsOn installTeamcityReporter
|
||||
args = ['--reporter', 'mocha-teamcity-reporter']
|
||||
}
|
||||
else {
|
||||
args = ['--reporter', 'min']
|
||||
}
|
||||
|
||||
args += [jsTestOutputFile, kotlinTestJsTestOutputFile]
|
||||
|
||||
execOverrides {
|
||||
it.ignoreExitValue = rootProject.ignoreTestFailures
|
||||
it.environment('NODE_PATH', [file(jsOutputFile).parent, file(kotlinTestJsOutputFile).parent].join(File.pathSeparator))
|
||||
it.workingDir = buildDir
|
||||
}
|
||||
}
|
||||
|
||||
test.dependsOn runMocha
|
||||
@@ -1,8 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
internal object DefaultConstructorMarker
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.random
|
||||
|
||||
import kotlin.math.pow
|
||||
|
||||
// TODO: use stdlib file when math.pow is fixed
|
||||
|
||||
internal actual fun defaultPlatformRandom(): Random =
|
||||
Random(js("(Math.random() * Math.pow(2, 32)) | 0").unsafeCast<Int>())
|
||||
|
||||
|
||||
internal actual fun fastLog2(value: Int): Int {
|
||||
// TODO: not so fast, make faster
|
||||
var v = value
|
||||
var log = -1
|
||||
while (v != 0) {
|
||||
v = v.ushr(1)
|
||||
log++
|
||||
}
|
||||
return log
|
||||
}
|
||||
|
||||
internal actual fun doubleFromParts(hi26: Int, low27: Int): Double =
|
||||
hi26 * (2.0.pow(-26)) + low27 * (2.0.pow(-53))
|
||||
@@ -1,95 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
import withType
|
||||
|
||||
external fun <T> Array(size: Int): Array<T>
|
||||
|
||||
internal fun <T> fillArrayVal(array: Array<T>, initValue: T): Array<T> {
|
||||
for (i in 0..array.size - 1) {
|
||||
array[i] = initValue
|
||||
}
|
||||
return array
|
||||
}
|
||||
|
||||
internal inline fun <T> arrayWithFun(size: Int, init: (Int) -> T) = fillArrayFun(Array<T>(size), init)
|
||||
|
||||
internal inline fun <T> fillArrayFun(array: dynamic, init: (Int) -> T): Array<T> {
|
||||
val result = array.unsafeCast<Array<T>>()
|
||||
var i = 0
|
||||
while (i != result.size) {
|
||||
result[i] = init(i)
|
||||
++i
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun booleanArray(size: Int): BooleanArray = withType("BooleanArray", fillArrayVal(Array<Boolean>(size), false)).unsafeCast<BooleanArray>()
|
||||
|
||||
internal fun booleanArrayOf(arr: Array<Boolean>): BooleanArray = withType("BooleanArray", arr.asDynamic().slice()).unsafeCast<BooleanArray>()
|
||||
|
||||
internal fun charArray(size: Int): CharArray = withType("CharArray", fillArrayVal(Array<Int>(size), 0)).unsafeCast<CharArray>()
|
||||
|
||||
internal fun charArrayOf(arr: Array<Char>): CharArray = withType("CharArray", arr.asDynamic().slice()).unsafeCast<CharArray>()
|
||||
|
||||
internal fun longArray(size: Int): LongArray = withType("LongArray", fillArrayVal(Array<Long>(size), 0L)).unsafeCast<LongArray>()
|
||||
|
||||
internal fun longArrayOf(arr: Array<Long>): LongArray = withType("LongArray", arr.asDynamic().slice()).unsafeCast<LongArray>()
|
||||
|
||||
internal fun <T> arrayIterator(array: Array<T>) = object : Iterator<T> {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun next() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun booleanArrayIterator(array: BooleanArray) = object : BooleanIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextBoolean() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun byteArrayIterator(array: ByteArray) = object : ByteIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextByte() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun shortArrayIterator(array: ShortArray) = object : ShortIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextShort() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun charArrayIterator(array: CharArray) = object : CharIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextChar() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun intArrayIterator(array: IntArray) = object : IntIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextInt() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun floatArrayIterator(array: FloatArray) = object : FloatIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextFloat() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun doubleArrayIterator(array: DoubleArray) = object : DoubleIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextDouble() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
internal fun longArrayIterator(array: LongArray) = object : LongIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index != array.size
|
||||
override fun nextLong() = if (index != array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
@@ -1,204 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:Suppress(
|
||||
"NON_ABSTRACT_FUNCTION_WITH_NO_BODY",
|
||||
"MUST_BE_INITIALIZED_OR_BE_ABSTRACT",
|
||||
"EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE",
|
||||
"PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED",
|
||||
"WRONG_MODIFIER_TARGET"
|
||||
)
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* An array of bytes. When targeting the JVM, instances of this class are represented as `byte[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class ByteArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Byte)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Byte
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Byte): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): ByteIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of chars. When targeting the JVM, instances of this class are represented as `char[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to null char (`\u0000').
|
||||
*/
|
||||
public class CharArray(size: Int) {
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Char
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Char): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): CharIterator
|
||||
}
|
||||
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun CharArray(size: Int, init: (Int) -> Char): CharArray {
|
||||
val result = CharArray(size)
|
||||
var i = 0
|
||||
while (i != result.size) {
|
||||
result[i] = init(i)
|
||||
++i
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of shorts. When targeting the JVM, instances of this class are represented as `short[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class ShortArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Short)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Short
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Short): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): ShortIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of ints. When targeting the JVM, instances of this class are represented as `int[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class IntArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Int)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Int
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Int): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): IntIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of longs. When targeting the JVM, instances of this class are represented as `long[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class LongArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Long)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Long
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Long): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): LongIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of floats. When targeting the JVM, instances of this class are represented as `float[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class FloatArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Float)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Float
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Float): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): FloatIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of doubles. When targeting the JVM, instances of this class are represented as `double[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to zero.
|
||||
*/
|
||||
public class DoubleArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Double)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Double
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Double): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): DoubleIterator
|
||||
}
|
||||
|
||||
/**
|
||||
* An array of booleans. When targeting the JVM, instances of this class are represented as `boolean[]`.
|
||||
* @constructor Creates a new array of the specified [size], with all elements initialized to `false`.
|
||||
*/
|
||||
public class BooleanArray(size: Int) {
|
||||
/**
|
||||
* Creates a new array of the specified [size], where each element is calculated by calling the specified
|
||||
* [init] function. The [init] function returns an array element given its index.
|
||||
*/
|
||||
public inline constructor(size: Int, init: (Int) -> Boolean)
|
||||
|
||||
/** Returns the array element at the given [index]. This method can be called using the index operator. */
|
||||
public operator fun get(index: Int): Boolean
|
||||
/** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */
|
||||
public operator fun set(index: Int, value: Boolean): Unit
|
||||
|
||||
/** Returns the number of elements in the array. */
|
||||
public val size: Int
|
||||
|
||||
/** Creates an iterator over the elements of the array. */
|
||||
public operator fun iterator(): BooleanIterator
|
||||
}
|
||||
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Represents a 16-bit Unicode character.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `char`.
|
||||
*/
|
||||
@Suppress("NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS")
|
||||
public inline class Char internal constructor (val value: Int) : Comparable<Char> {
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override fun compareTo(other: Char): Int = value - other.value
|
||||
|
||||
/** Adds the other Int value to this value resulting a Char. */
|
||||
public operator fun plus(other: Int): Char = (value + other).toChar()
|
||||
|
||||
/** Subtracts the other Char value from this value resulting an Int. */
|
||||
public operator fun minus(other: Char): Int = value - other.value
|
||||
/** Subtracts the other Int value from this value resulting a Char. */
|
||||
public operator fun minus(other: Int): Char = (value - other).toChar()
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Char = (value + 1).toChar()
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Char = (value - 1).toChar()
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Char): CharRange = CharRange(this, other)
|
||||
|
||||
/** Returns the value of this character as a `Byte`. */
|
||||
public fun toByte(): Byte = value.toByte()
|
||||
/** Returns the value of this character as a `Char`. */
|
||||
public fun toChar(): Char = this
|
||||
/** Returns the value of this character as a `Short`. */
|
||||
public fun toShort(): Short = value.toShort()
|
||||
/** Returns the value of this character as a `Int`. */
|
||||
public fun toInt(): Int = value
|
||||
/** Returns the value of this character as a `Long`. */
|
||||
public fun toLong(): Long = value.toLong()
|
||||
/** Returns the value of this character as a `Float`. */
|
||||
public fun toFloat(): Float = value.toFloat()
|
||||
/** Returns the value of this character as a `Double`. */
|
||||
public fun toDouble(): Double = value.toDouble()
|
||||
|
||||
override fun toString(): String {
|
||||
val value = value
|
||||
return js("String.fromCharCode(value)").unsafeCast<String>()
|
||||
}
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* The minimum value of a character code unit.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val MIN_VALUE: Char = '\u0000'
|
||||
|
||||
/**
|
||||
* The maximum value of a character code unit.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val MAX_VALUE: Char = '\uFFFF'
|
||||
|
||||
/**
|
||||
* The minimum value of a Unicode high-surrogate code unit.
|
||||
*/
|
||||
public const val MIN_HIGH_SURROGATE: Char = '\uD800'
|
||||
|
||||
/**
|
||||
* The maximum value of a Unicode high-surrogate code unit.
|
||||
*/
|
||||
public const val MAX_HIGH_SURROGATE: Char = '\uDBFF'
|
||||
|
||||
/**
|
||||
* The minimum value of a Unicode low-surrogate code unit.
|
||||
*/
|
||||
public const val MIN_LOW_SURROGATE: Char = '\uDC00'
|
||||
|
||||
/**
|
||||
* The maximum value of a Unicode low-surrogate code unit.
|
||||
*/
|
||||
public const val MAX_LOW_SURROGATE: Char = '\uDFFF'
|
||||
|
||||
/**
|
||||
* The minimum value of a Unicode surrogate code unit.
|
||||
*/
|
||||
public const val MIN_SURROGATE: Char = MIN_HIGH_SURROGATE
|
||||
|
||||
/**
|
||||
* The maximum value of a Unicode surrogate code unit.
|
||||
*/
|
||||
public const val MAX_SURROGATE: Char = MAX_LOW_SURROGATE
|
||||
|
||||
/**
|
||||
* The number of bytes used to represent a Char in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BYTES: Int = 2
|
||||
|
||||
/**
|
||||
* The number of bits used to represent a Char in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BITS: Int = 16
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
import kotlin.js.*
|
||||
|
||||
abstract class Enum<E : Enum<E>>(val name: String, val ordinal: Int) : Comparable<E> {
|
||||
|
||||
override fun compareTo(other: E) = ordinal.compareTo(other.ordinal)
|
||||
|
||||
override fun equals(other: Any?) = this === other
|
||||
|
||||
override fun hashCode(): Int = identityHashCode(this)
|
||||
|
||||
override fun toString() = name
|
||||
|
||||
companion object
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
import kotlin.internal.PureReifiable
|
||||
|
||||
/**
|
||||
* Returns a string representation of the object. Can be called with a null receiver, in which case
|
||||
* it returns the string "null".
|
||||
*/
|
||||
public fun Any?.toString(): String = this?.toString() ?: "null"
|
||||
|
||||
|
||||
/**
|
||||
* Concatenates this string with the string representation of the given [other] object. If either the receiver
|
||||
* or the [other] object are null, they are represented as the string "null".
|
||||
*/
|
||||
public operator fun String?.plus(other: Any?): String =
|
||||
(this?.toString() ?: "null").plus(other?.toString() ?: "null")
|
||||
|
||||
/**
|
||||
* Returns an array of objects of the given type with the given [size], initialized with null values.
|
||||
*/
|
||||
public inline fun <reified T> arrayOfNulls(size: Int): Array<T?> = Array<T?>(size)
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified elements.
|
||||
*/
|
||||
public inline fun <T> arrayOf(vararg elements: T): Array<T> = elements.unsafeCast<Array<T>>()
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Double] numbers.
|
||||
*/
|
||||
public inline fun doubleArrayOf(vararg elements: Double): DoubleArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Float] numbers.
|
||||
*/
|
||||
public inline fun floatArrayOf(vararg elements: Float): FloatArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Long] numbers.
|
||||
*/
|
||||
public inline fun longArrayOf(vararg elements: Long): LongArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Int] numbers.
|
||||
*/
|
||||
public inline fun intArrayOf(vararg elements: Int): IntArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified characters.
|
||||
*/
|
||||
public inline fun charArrayOf(vararg elements: Char): CharArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Short] numbers.
|
||||
*/
|
||||
public inline fun shortArrayOf(vararg elements: Short): ShortArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified [Byte] numbers.
|
||||
*/
|
||||
public inline fun byteArrayOf(vararg elements: Byte): ByteArray = elements
|
||||
|
||||
/**
|
||||
* Returns an array containing the specified boolean values.
|
||||
*/
|
||||
public inline fun booleanArrayOf(vararg elements: Boolean): BooleanArray = elements
|
||||
|
||||
// Use non-inline calls to enumValuesIntrinsic and enumValueOfIntrinsic calls in order
|
||||
// for compiler to replace them with method calls of concrete enum classes after inlining.
|
||||
// TODO: Figure out better solution (Inline hacks? Dynamic calls to stable mangled names?)
|
||||
|
||||
/**
|
||||
* Returns an array containing enum T entries.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public inline fun <reified T : Enum<T>> enumValues(): Array<T> = enumValuesIntrinsic<T>()
|
||||
|
||||
/**
|
||||
* Returns an enum entry with specified name.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public inline fun <reified T : Enum<T>> enumValueOf(name: String): T = enumValueOfIntrinsic<T>(name)
|
||||
@@ -1,965 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
// Auto-generated file. DO NOT EDIT!
|
||||
@file:Suppress("NON_ABSTRACT_FUNCTION_WITH_NO_BODY")
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Represents a 8-bit signed integer.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `byte`.
|
||||
*/
|
||||
public class Byte private constructor() : Number(), Comparable<Byte> {
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the minimum value an instance of Byte can have.
|
||||
*/
|
||||
public const val MIN_VALUE: Byte = -128
|
||||
|
||||
/**
|
||||
* A constant holding the maximum value an instance of Byte can have.
|
||||
*/
|
||||
public const val MAX_VALUE: Byte = 127
|
||||
|
||||
/**
|
||||
* The number of bytes used to represent an instance of Byte in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BYTES: Int = 1
|
||||
|
||||
/**
|
||||
* The number of bits used to represent an instance of Byte in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BITS: Int = 8
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Byte): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Short): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Int): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Long): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Float): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Double): Int
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Byte): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Short): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Int): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Long
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Float): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Double): Double
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Byte): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Short): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Int): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Long
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Float): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Double): Double
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Byte): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Short): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Int): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Long
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Float): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Double): Double
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Byte): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Short): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Int): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Long
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Float): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Double): Double
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Byte
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Byte
|
||||
/** Returns this value. */
|
||||
public operator fun unaryPlus(): Int
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Int
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Byte): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Short): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Int): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Long): LongRange
|
||||
|
||||
public override fun toByte(): Byte
|
||||
public override fun toChar(): Char
|
||||
public override fun toShort(): Short
|
||||
public override fun toInt(): Int
|
||||
public override fun toLong(): Long
|
||||
public override fun toFloat(): Float
|
||||
public override fun toDouble(): Double
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a 16-bit signed integer.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `short`.
|
||||
*/
|
||||
public class Short private constructor() : Number(), Comparable<Short> {
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the minimum value an instance of Short can have.
|
||||
*/
|
||||
public const val MIN_VALUE: Short = -32768
|
||||
|
||||
/**
|
||||
* A constant holding the maximum value an instance of Short can have.
|
||||
*/
|
||||
public const val MAX_VALUE: Short = 32767
|
||||
|
||||
/**
|
||||
* The number of bytes used to represent an instance of Short in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BYTES: Int = 2
|
||||
|
||||
/**
|
||||
* The number of bits used to represent an instance of Short in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BITS: Int = 16
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Byte): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Short): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Int): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Long): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Float): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Double): Int
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Byte): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Short): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Int): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Long
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Float): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Double): Double
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Byte): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Short): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Int): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Long
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Float): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Double): Double
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Byte): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Short): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Int): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Long
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Float): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Double): Double
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Byte): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Short): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Int): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Long
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Float): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Double): Double
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Short
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Short
|
||||
/** Returns this value. */
|
||||
public operator fun unaryPlus(): Int
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Int
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Byte): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Short): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Int): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Long): LongRange
|
||||
|
||||
public override fun toByte(): Byte
|
||||
public override fun toChar(): Char
|
||||
public override fun toShort(): Short
|
||||
public override fun toInt(): Int
|
||||
public override fun toLong(): Long
|
||||
public override fun toFloat(): Float
|
||||
public override fun toDouble(): Double
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a 32-bit signed integer.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `int`.
|
||||
*/
|
||||
public class Int private constructor() : Number(), Comparable<Int> {
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the minimum value an instance of Int can have.
|
||||
*/
|
||||
public const val MIN_VALUE: Int = -2147483648
|
||||
|
||||
/**
|
||||
* A constant holding the maximum value an instance of Int can have.
|
||||
*/
|
||||
public const val MAX_VALUE: Int = 2147483647
|
||||
|
||||
/**
|
||||
* The number of bytes used to represent an instance of Int in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BYTES: Int = 4
|
||||
|
||||
/**
|
||||
* The number of bits used to represent an instance of Int in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BITS: Int = 32
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Byte): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Short): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Int): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Long): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Float): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Double): Int
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Byte): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Short): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Int): Int
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Long
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Float): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Double): Double
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Byte): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Short): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Int): Int
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Long
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Float): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Double): Double
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Byte): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Short): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Int): Int
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Long
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Float): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Double): Double
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Byte): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Short): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Int): Int
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Long
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Float): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Byte): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Short): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Int): Int
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Long
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Double): Double
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Int
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Int
|
||||
/** Returns this value. */
|
||||
public operator fun unaryPlus(): Int
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Int
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Byte): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Short): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Int): IntRange
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Long): LongRange
|
||||
|
||||
/** Shifts this value left by the [bitCount] number of bits. */
|
||||
public infix fun shl(bitCount: Int): Int
|
||||
/** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with copies of the sign bit. */
|
||||
public infix fun shr(bitCount: Int): Int
|
||||
/** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with zeros. */
|
||||
public infix fun ushr(bitCount: Int): Int
|
||||
/** Performs a bitwise AND operation between the two values. */
|
||||
public infix fun and(other: Int): Int
|
||||
/** Performs a bitwise OR operation between the two values. */
|
||||
public infix fun or(other: Int): Int
|
||||
/** Performs a bitwise XOR operation between the two values. */
|
||||
public infix fun xor(other: Int): Int
|
||||
/** Inverts the bits in this value. */
|
||||
public fun inv(): Int
|
||||
|
||||
public override fun toByte(): Byte
|
||||
public override fun toChar(): Char
|
||||
public override fun toShort(): Short
|
||||
public override fun toInt(): Int
|
||||
public override fun toLong(): Long
|
||||
public override fun toFloat(): Float
|
||||
public override fun toDouble(): Double
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a single-precision 32-bit IEEE 754 floating point number.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `float`.
|
||||
*/
|
||||
public class Float private constructor() : Number(), Comparable<Float> {
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the smallest *positive* nonzero value of Float.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val MIN_VALUE: Float
|
||||
|
||||
/**
|
||||
* A constant holding the largest positive finite value of Float.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val MAX_VALUE: Float
|
||||
|
||||
/**
|
||||
* A constant holding the positive infinity value of Float.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val POSITIVE_INFINITY: Float
|
||||
|
||||
/**
|
||||
* A constant holding the negative infinity value of Float.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val NEGATIVE_INFINITY: Float
|
||||
|
||||
/**
|
||||
* A constant holding the "not a number" value of Float.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val NaN: Float
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Byte): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Short): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Int): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Long): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Float): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Double): Int
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Byte): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Short): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Int): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Float): Float
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Double): Double
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Byte): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Short): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Int): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Float): Float
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Double): Double
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Byte): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Short): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Int): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Float): Float
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Double): Double
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Byte): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Short): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Int): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Float): Float
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Byte): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Short): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Int): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Long): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Byte): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Short): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Int): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Float): Float
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Double): Double
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Float
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Float
|
||||
/** Returns this value. */
|
||||
public operator fun unaryPlus(): Float
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Float
|
||||
|
||||
|
||||
public override fun toByte(): Byte
|
||||
public override fun toChar(): Char
|
||||
public override fun toShort(): Short
|
||||
public override fun toInt(): Int
|
||||
public override fun toLong(): Long
|
||||
public override fun toFloat(): Float
|
||||
public override fun toDouble(): Double
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a double-precision 64-bit IEEE 754 floating point number.
|
||||
* On the JVM, non-nullable values of this type are represented as values of the primitive type `double`.
|
||||
*/
|
||||
public class Double private constructor() : Number(), Comparable<Double> {
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the smallest *positive* nonzero value of Double.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val MIN_VALUE: Double
|
||||
|
||||
/**
|
||||
* A constant holding the largest positive finite value of Double.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val MAX_VALUE: Double
|
||||
|
||||
/**
|
||||
* A constant holding the positive infinity value of Double.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val POSITIVE_INFINITY: Double
|
||||
|
||||
/**
|
||||
* A constant holding the negative infinity value of Double.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val NEGATIVE_INFINITY: Double
|
||||
|
||||
/**
|
||||
* A constant holding the "not a number" value of Double.
|
||||
*/
|
||||
@Suppress("MUST_BE_INITIALIZED_OR_BE_ABSTRACT")
|
||||
public val NaN: Double
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Byte): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Short): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Int): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Long): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public operator fun compareTo(other: Float): Int
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Double): Int
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Byte): Double
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Short): Double
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Int): Double
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Double
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Float): Double
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Double): Double
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Byte): Double
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Short): Double
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Int): Double
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Double
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Float): Double
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Double): Double
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Byte): Double
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Short): Double
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Int): Double
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Double
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Float): Double
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Double): Double
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Byte): Double
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Short): Double
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Int): Double
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Double
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Float): Double
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Byte): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Short): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Int): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Long): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Float): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.ERROR)
|
||||
public operator fun mod(other: Double): Double
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Byte): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Short): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Int): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Float): Double
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Double): Double
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Double
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Double
|
||||
/** Returns this value. */
|
||||
public operator fun unaryPlus(): Double
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Double
|
||||
|
||||
|
||||
public override fun toByte(): Byte
|
||||
public override fun toChar(): Char
|
||||
public override fun toShort(): Short
|
||||
public override fun toInt(): Int
|
||||
public override fun toLong(): Long
|
||||
public override fun toFloat(): Float
|
||||
public override fun toDouble(): Double
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
internal annotation class DoNotIntrinsify
|
||||
|
||||
@PublishedApi
|
||||
@DoNotIntrinsify
|
||||
internal fun charSequenceGet(a: CharSequence, index: Int): Char {
|
||||
return if (isString(a)) {
|
||||
Char(a.asDynamic().charCodeAt(index).unsafeCast<Int>())
|
||||
} else {
|
||||
a[index]
|
||||
}
|
||||
}
|
||||
|
||||
@PublishedApi
|
||||
@DoNotIntrinsify
|
||||
internal fun charSequenceLength(a: CharSequence): Int {
|
||||
return if (isString(a)) {
|
||||
js("a.length").unsafeCast<Int>()
|
||||
} else {
|
||||
a.length
|
||||
}
|
||||
}
|
||||
|
||||
@PublishedApi
|
||||
@DoNotIntrinsify
|
||||
internal fun charSequenceSubSequence(a: CharSequence, startIndex: Int, endIndex: Int): CharSequence {
|
||||
return if (isString(a)) {
|
||||
a.asDynamic().substring(startIndex, endIndex).unsafeCast<String>()
|
||||
} else {
|
||||
a.subSequence(startIndex, endIndex)
|
||||
}
|
||||
}
|
||||
|
||||
// Keeping this function as separate non-inline to intrincify `is` operator
|
||||
internal fun isString(a: CharSequence) = a is String
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.collections
|
||||
|
||||
import kotlin.js.*
|
||||
|
||||
// Copied from libraries/stdlib/js/src/kotlin/collections/utils.kt
|
||||
// Current inliner doesn't rename symbols inside `js` fun
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
internal fun deleteProperty(obj: Any, property: Any) {
|
||||
js("delete obj[property]")
|
||||
}
|
||||
|
||||
internal fun arrayToString(array: Array<*>) = array.joinToString(", ", "[", "]") { toString(it) }
|
||||
|
||||
internal fun <T> Array<out T>.contentDeepHashCodeInternal(): Int {
|
||||
var result = 1
|
||||
for (element in this) {
|
||||
val elementHash = when {
|
||||
element == null -> 0
|
||||
isArrayish(element) -> (element.unsafeCast<Array<*>>()).contentDeepHashCodeInternal()
|
||||
|
||||
element is UByteArray -> element.contentHashCode()
|
||||
element is UShortArray -> element.contentHashCode()
|
||||
element is UIntArray -> element.contentHashCode()
|
||||
element is ULongArray -> element.contentHashCode()
|
||||
|
||||
else -> element.hashCode()
|
||||
}
|
||||
|
||||
result = 31 * result + elementHash
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun <T> T.contentEqualsInternal(other: T): Boolean {
|
||||
val a = this.asDynamic()
|
||||
val b = other.asDynamic()
|
||||
|
||||
if (a === b) return true
|
||||
|
||||
if (!isArrayish(b) || a.length != b.length) return false
|
||||
|
||||
for (i in 0 until a.length) {
|
||||
if (a[i] != b[i]) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
internal fun <T> T.contentHashCodeInternal(): Int {
|
||||
val a = this.asDynamic()
|
||||
var result = 1
|
||||
|
||||
for (i in 0 until a.length) {
|
||||
result = result * 31 + hashCode(a[i])
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
|
||||
// Adopted from misc.js
|
||||
|
||||
fun compareTo(a: dynamic, b: dynamic): Int = when (typeOf(a)) {
|
||||
"number" -> when {
|
||||
typeOf(b) == "number" ->
|
||||
doubleCompareTo(a, b)
|
||||
b is Long ->
|
||||
doubleCompareTo(a, b.toDouble())
|
||||
else ->
|
||||
primitiveCompareTo(a, b)
|
||||
}
|
||||
|
||||
"string", "boolean" -> primitiveCompareTo(a, b)
|
||||
|
||||
else -> compareToDoNotIntrinsicify(a, b)
|
||||
}
|
||||
|
||||
@DoNotIntrinsify
|
||||
private fun <T : Comparable<T>> compareToDoNotIntrinsicify(a: Comparable<T>, b: T) =
|
||||
a.compareTo(b)
|
||||
|
||||
fun primitiveCompareTo(a: dynamic, b: dynamic): Int =
|
||||
js("a < b ? -1 : a > b ? 1 : 0").unsafeCast<Int>()
|
||||
|
||||
fun doubleCompareTo(a: dynamic, b: dynamic): Int =
|
||||
js("""
|
||||
if (a < b) return -1;
|
||||
if (a > b) return 1;
|
||||
|
||||
if (a === b) {
|
||||
if (a !== 0) return 0;
|
||||
|
||||
var ia = 1 / a;
|
||||
return ia === 1 / b ? 0 : (ia < 0 ? -1 : 1);
|
||||
}
|
||||
|
||||
return a !== a ? (b !== b ? 0 : 1) : -1
|
||||
""").unsafeCast<Int>()
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
fun equals(obj1: dynamic, obj2: dynamic): Boolean {
|
||||
if (obj1 == null) {
|
||||
return obj2 == null
|
||||
}
|
||||
if (obj2 == null) {
|
||||
return false
|
||||
}
|
||||
|
||||
return js("""
|
||||
if (typeof obj1 === "object" && typeof obj1.equals === "function") {
|
||||
return obj1.equals(obj2);
|
||||
}
|
||||
|
||||
if (obj1 !== obj1) {
|
||||
return obj2 !== obj2;
|
||||
}
|
||||
|
||||
if (typeof obj1 === "number" && typeof obj2 === "number") {
|
||||
return obj1 === obj2 && (obj1 !== 0 || 1 / obj1 === 1 / obj2)
|
||||
}
|
||||
return obj1 === obj2;
|
||||
""").unsafeCast<Boolean>()
|
||||
}
|
||||
|
||||
fun toString(o: dynamic): String = when {
|
||||
js("o == null").unsafeCast<Boolean>() -> "null"
|
||||
isArrayish(o) -> "[...]"
|
||||
else -> js("o.toString()").unsafeCast<String>()
|
||||
}
|
||||
|
||||
fun anyToString(o: dynamic): String = js("Object.prototype.toString.call(o)")
|
||||
|
||||
fun hashCode(obj: dynamic): Int {
|
||||
if (obj == null)
|
||||
return 0
|
||||
|
||||
return when (typeOf(obj)) {
|
||||
"object" -> if ("function" === js("typeof obj.hashCode")) js("obj.hashCode()") else getObjectHashCode(obj)
|
||||
"function" -> getObjectHashCode(obj)
|
||||
"number" -> getNumberHashCode(obj)
|
||||
"boolean" -> if(obj.unsafeCast<Boolean>()) 1 else 0
|
||||
else -> getStringHashCode(js("String(obj)"))
|
||||
}
|
||||
}
|
||||
|
||||
fun getObjectHashCode(obj: dynamic) = js("""
|
||||
var POW_2_32 = 4294967296;
|
||||
var OBJECT_HASH_CODE_PROPERTY_NAME = "kotlinHashCodeValue${"$"}";
|
||||
|
||||
if (!(OBJECT_HASH_CODE_PROPERTY_NAME in obj)) {
|
||||
var hash = (Math.random() * POW_2_32) | 0; // Make 32-bit singed integer.
|
||||
Object.defineProperty(obj, OBJECT_HASH_CODE_PROPERTY_NAME, { value: hash, enumerable: false });
|
||||
}
|
||||
return obj[OBJECT_HASH_CODE_PROPERTY_NAME];
|
||||
""").unsafeCast<Int>();
|
||||
|
||||
fun getStringHashCode(str: String): Int {
|
||||
var hash = 0
|
||||
val length: Int = js("str.length") // TODO: Implement WString.length
|
||||
for (i in 0..length-1) {
|
||||
val code: Int = js("str.charCodeAt(i)")
|
||||
hash = hash * 31 + code
|
||||
}
|
||||
return hash
|
||||
}
|
||||
|
||||
fun getNumberHashCode(obj: dynamic) = js("""
|
||||
if ((obj | 0) === obj) {
|
||||
return obj | 0;
|
||||
}
|
||||
else {
|
||||
var byteBuffer = new ArrayBuffer (8);
|
||||
var bufFloat64 = new Float64Array (byteBuffer);
|
||||
var bufInt32 = new Int32Array (byteBuffer);
|
||||
|
||||
bufFloat64[0] = obj;
|
||||
return (bufInt32[1] * 31 | 0)+bufInt32[0] | 0;
|
||||
}
|
||||
""").unsafeCast<Int>()
|
||||
|
||||
fun identityHashCode(obj: dynamic): Int = getObjectHashCode(obj)
|
||||
|
||||
|
||||
@JsName("captureStack")
|
||||
internal fun captureStack(instance: Throwable) {
|
||||
if (js("Error").captureStackTrace) {
|
||||
js("Error").captureStackTrace(instance, instance::class.js);
|
||||
} else {
|
||||
instance.asDynamic().stack = js("new Error()").stack;
|
||||
}
|
||||
}
|
||||
|
||||
@JsName("newThrowable")
|
||||
internal fun newThrowable(message: String?, cause: Throwable?): Throwable {
|
||||
val throwable = js("new Error()")
|
||||
throwable.message = if (message == null) {
|
||||
if (cause != null) js("cause.toString()") else null
|
||||
} else {
|
||||
message
|
||||
}
|
||||
throwable.cause = cause
|
||||
throwable.name = "Throwable"
|
||||
return throwable
|
||||
}
|
||||
|
||||
internal fun <T, R> boxIntrinsic(x: T): R = error("Should be lowered")
|
||||
internal fun <T, R> unboxIntrinsic(x: T): R = error("Should be lowered")
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
|
||||
package kotlin.js
|
||||
|
||||
import kotlin.js.coroutineAliases.*
|
||||
|
||||
|
||||
@PublishedApi
|
||||
internal fun <T> getContinuation(): ContinuationAlias<T> { throw Exception("Implemented as intrinsic") }
|
||||
// Do we really need this intrinsic in JS?
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <T> returnIfSuspended(@Suppress("UNUSED_PARAMETER") argument: Any?): T {
|
||||
throw Exception("Implemented as intrinsic")
|
||||
}
|
||||
|
||||
@PublishedApi
|
||||
internal fun <T> interceptContinuationIfNeeded(
|
||||
context: CoroutineContextAlias,
|
||||
continuation: ContinuationAlias<T>
|
||||
) = context[ContinuationInterceptorAlias]?.interceptContinuation(continuation) ?: continuation
|
||||
|
||||
|
||||
@SinceKotlin("1.2")
|
||||
@PublishedApi
|
||||
internal suspend fun getCoroutineContext(): CoroutineContextAlias = getContinuation<Any?>().context
|
||||
|
||||
// TODO: remove `JS` suffix oncec `NameGenerator` is implemented
|
||||
@PublishedApi
|
||||
internal suspend fun <T> suspendCoroutineUninterceptedOrReturnJS(block: (ContinuationAlias<T>) -> Any?): T =
|
||||
returnIfSuspended<T>(block(getContinuation<T>()))
|
||||
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.coroutines
|
||||
|
||||
import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
@JsName("CoroutineImpl")
|
||||
internal abstract class CoroutineImpl(private val resultContinuation: Continuation<Any?>?) : Continuation<Any?> {
|
||||
protected var state = 0
|
||||
protected var exceptionState = 0
|
||||
protected var result: dynamic = null
|
||||
protected var exception: dynamic = null
|
||||
protected var finallyPath: Array<Int>? = null
|
||||
|
||||
public override val context: CoroutineContext get() = resultContinuation!!.context
|
||||
|
||||
private var intercepted_: Continuation<Any?>? = null
|
||||
|
||||
public fun intercepted(): Continuation<Any?> =
|
||||
intercepted_
|
||||
?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)
|
||||
.also { intercepted_ = it }
|
||||
|
||||
override fun resumeWith(result: Result<Any?>) {
|
||||
var current = this
|
||||
var currentResult: Any? = result.getOrNull()
|
||||
var currentException: Throwable? = result.exceptionOrNull()
|
||||
|
||||
// This loop unrolls recursion in current.resumeWith(param) to make saner and shorter stack traces on resume
|
||||
while (true) {
|
||||
with(current) {
|
||||
// Set result and exception fields in the current continuation
|
||||
if (currentException == null) {
|
||||
this.result = currentResult
|
||||
} else {
|
||||
state = exceptionState
|
||||
exception = currentException
|
||||
}
|
||||
|
||||
try {
|
||||
val outcome = doResume()
|
||||
if (outcome === COROUTINE_SUSPENDED) return
|
||||
currentResult = outcome
|
||||
currentException = null
|
||||
} catch (exception: dynamic) { // Catch all exceptions
|
||||
currentResult = null
|
||||
currentException = exception.unsafeCast<Throwable>()
|
||||
}
|
||||
|
||||
releaseIntercepted() // this state machine instance is terminating
|
||||
|
||||
val completion = resultContinuation!!
|
||||
|
||||
if (completion is CoroutineImpl) {
|
||||
// unrolling recursion via loop
|
||||
current = completion
|
||||
} else {
|
||||
// top-level completion reached -- invoke and return
|
||||
if (currentException != null) {
|
||||
completion.resumeWithException(currentException!!)
|
||||
} else {
|
||||
completion.resume(currentResult)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun releaseIntercepted() {
|
||||
val intercepted = intercepted_
|
||||
if (intercepted != null && intercepted !== this) {
|
||||
context[ContinuationInterceptor]!!.releaseInterceptedContinuation(intercepted)
|
||||
}
|
||||
this.intercepted_ = CompletedContinuation // just in case
|
||||
}
|
||||
|
||||
protected abstract fun doResume(): Any?
|
||||
|
||||
public open fun create(completion: Continuation<*>): Continuation<Unit> {
|
||||
throw UnsupportedOperationException("create(Continuation) has not been overridden")
|
||||
}
|
||||
|
||||
public open fun create(value: Any?, completion: Continuation<*>): Continuation<Unit> {
|
||||
throw UnsupportedOperationException("create(Any?;Continuation) has not been overridden")
|
||||
}
|
||||
}
|
||||
|
||||
internal object CompletedContinuation : Continuation<Any?> {
|
||||
override val context: CoroutineContext
|
||||
get() = error("This continuation is already complete")
|
||||
|
||||
override fun resumeWith(result: Result<Any?>) {
|
||||
error("This continuation is already complete")
|
||||
}
|
||||
|
||||
override fun toString(): String = "This continuation is already complete"
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "UNCHECKED_CAST")
|
||||
|
||||
package kotlin.coroutines.intrinsics
|
||||
|
||||
import kotlin.coroutines.*
|
||||
import kotlin.internal.InlineOnly
|
||||
|
||||
/**
|
||||
* Starts unintercepted coroutine without receiver and with result type [T] and executes it until its first suspension.
|
||||
* Returns the result of the coroutine or throws its exception if it does not suspend or [COROUTINE_SUSPENDED] if it suspends.
|
||||
* In the later case, the [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* The coroutine is started directly in the invoker's thread without going through the [ContinuationInterceptor] that might
|
||||
* be present in the completion's [CoroutineContext]. It is invoker's responsibility to ensure that the proper invocation
|
||||
* context is established.
|
||||
*
|
||||
* This function is designed to be used from inside of [suspendCoroutineUninterceptedOrReturn] to resume the execution of suspended
|
||||
* coroutine using a reference to the suspending function.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@InlineOnly
|
||||
public actual inline fun <T> (suspend () -> T).startCoroutineUninterceptedOrReturn(
|
||||
completion: Continuation<T>
|
||||
): Any? {
|
||||
val a = this.asDynamic()
|
||||
return if (jsTypeOf(a) == "function") a(completion, false)
|
||||
else a.invoke(completion)
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts unintercepted coroutine with receiver type [R] and result type [T] and executes it until its first suspension.
|
||||
* Returns the result of the coroutine or throws its exception if it does not suspend or [COROUTINE_SUSPENDED] if it suspends.
|
||||
* In the later case, the [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* The coroutine is started directly in the invoker's thread without going through the [ContinuationInterceptor] that might
|
||||
* be present in the completion's [CoroutineContext]. It is invoker's responsibility to ensure that the proper invocation
|
||||
* context is established.
|
||||
*
|
||||
* This function is designed to be used from inside of [suspendCoroutineUninterceptedOrReturn] to resume the execution of suspended
|
||||
* coroutine using a reference to the suspending function.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@InlineOnly
|
||||
public actual inline fun <R, T> (suspend R.() -> T).startCoroutineUninterceptedOrReturn(
|
||||
receiver: R,
|
||||
completion: Continuation<T>
|
||||
): Any? {
|
||||
val a = this.asDynamic()
|
||||
return if(jsTypeOf(a) == "function") a(receiver, completion, false)
|
||||
else a.invoke_P1(receiver, completion)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates unintercepted coroutine without receiver and with result type [T].
|
||||
* This function creates a new, fresh instance of suspendable computation every time it is invoked.
|
||||
*
|
||||
* To start executing the created coroutine, invoke `resume(Unit)` on the returned [Continuation] instance.
|
||||
* The [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* This function returns unintercepted continuation.
|
||||
* Invocation of `resume(Unit)` starts coroutine directly in the invoker's thread without going through the
|
||||
* [ContinuationInterceptor] that might be present in the completion's [CoroutineContext].
|
||||
* It is invoker's responsibility to ensure that the proper invocation context is established.
|
||||
* [Continuation.intercepted] can be used to acquire the intercepted continuation.
|
||||
*
|
||||
* Repeated invocation of any resume function on the resulting continuation corrupts the
|
||||
* state machine of the coroutine and may result in arbitrary behaviour or exception.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <T> (suspend () -> T).createCoroutineUnintercepted(
|
||||
completion: Continuation<T>
|
||||
): Continuation<Unit> =
|
||||
// Kotlin/JS suspend lambdas have an extra parameter `suspended`
|
||||
if (this.asDynamic().length == 2) {
|
||||
// When `suspended` is true the continuation is created, but not executed
|
||||
this.asDynamic()(completion, true)
|
||||
} else {
|
||||
createCoroutineFromSuspendFunction(completion) {
|
||||
val a = this.asDynamic()
|
||||
if (jsTypeOf(a) == "function") {
|
||||
a(completion)
|
||||
} else {
|
||||
a.invoke(completion)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates unintercepted coroutine with receiver type [R] and result type [T].
|
||||
* This function creates a new, fresh instance of suspendable computation every time it is invoked.
|
||||
*
|
||||
* To start executing the created coroutine, invoke `resume(Unit)` on the returned [Continuation] instance.
|
||||
* The [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* This function returns unintercepted continuation.
|
||||
* Invocation of `resume(Unit)` starts coroutine directly in the invoker's thread without going through the
|
||||
* [ContinuationInterceptor] that might be present in the completion's [CoroutineContext].
|
||||
* It is invoker's responsibility to ensure that the proper invocation context is established.
|
||||
* [Continuation.intercepted] can be used to acquire the intercepted continuation.
|
||||
*
|
||||
* Repeated invocation of any resume function on the resulting continuation corrupts the
|
||||
* state machine of the coroutine and may result in arbitrary behaviour or exception.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <R, T> (suspend R.() -> T).createCoroutineUnintercepted(
|
||||
receiver: R,
|
||||
completion: Continuation<T>
|
||||
): Continuation<Unit> =
|
||||
// Kotlin/JS suspend lambdas have an extra parameter `suspended`
|
||||
if (this.asDynamic().length == 3) {
|
||||
// When `suspended` is true the continuation is created, but not executed
|
||||
this.asDynamic()(receiver, completion, true)
|
||||
} else {
|
||||
createCoroutineFromSuspendFunction(completion) {
|
||||
val a = this.asDynamic()
|
||||
if (jsTypeOf(a) == "function") {
|
||||
a(receiver, completion)
|
||||
} else {
|
||||
a.invoke_P1(receiver, completion)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercepts this continuation with [ContinuationInterceptor].
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <T> Continuation<T>.intercepted(): Continuation<T> =
|
||||
(this as? CoroutineImpl)?.intercepted() ?: this
|
||||
|
||||
|
||||
private inline fun <T> createCoroutineFromSuspendFunction(
|
||||
completion: Continuation<T>,
|
||||
crossinline block: () -> Any?
|
||||
): Continuation<Unit> {
|
||||
return object : CoroutineImpl(completion as Continuation<Any?>) {
|
||||
override fun doResume(): Any? {
|
||||
if (exception != null) throw exception
|
||||
return block()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
|
||||
package kotlin.js.coroutineAliases
|
||||
|
||||
import kotlin.coroutines.*
|
||||
|
||||
|
||||
typealias ContinuationAlias<T> = Continuation<T>
|
||||
typealias CoroutineContextAlias = CoroutineContext
|
||||
typealias ContinuationInterceptorAlias = ContinuationInterceptor
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.collections
|
||||
|
||||
//
|
||||
// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt
|
||||
// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
|
||||
//
|
||||
|
||||
import kotlin.js.*
|
||||
import kotlin.ranges.contains
|
||||
import kotlin.ranges.reversed
|
||||
|
||||
/**
|
||||
* Reverses elements in the list in-place.
|
||||
*/
|
||||
public actual fun <T> MutableList<T>.reverse(): Unit {
|
||||
val midPoint = (size / 2) - 1
|
||||
if (midPoint < 0) return
|
||||
var reverseIndex = lastIndex
|
||||
for (index in 0..midPoint) {
|
||||
val tmp = this[index]
|
||||
this[index] = this[reverseIndex]
|
||||
this[reverseIndex] = tmp
|
||||
reverseIndex--
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,284 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.comparisons
|
||||
|
||||
//
|
||||
// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt
|
||||
// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
|
||||
//
|
||||
|
||||
import kotlin.js.*
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
* If values are equal, returns the first one.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public actual fun <T : Comparable<T>> maxOf(a: T, b: T): T {
|
||||
return if (a >= b) a else b
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Byte, b: Byte): Byte {
|
||||
return Math.max(a.toInt(), b.toInt()).unsafeCast<Byte>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Short, b: Short): Short {
|
||||
return Math.max(a.toInt(), b.toInt()).unsafeCast<Short>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Int, b: Int): Int {
|
||||
return Math.max(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@Suppress("DEPRECATION_ERROR", "NOTHING_TO_INLINE")
|
||||
public actual inline fun maxOf(a: Long, b: Long): Long {
|
||||
return if (a >= b) a else b
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Float, b: Float): Float {
|
||||
return Math.max(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Double, b: Double): Double {
|
||||
return Math.max(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public actual fun <T : Comparable<T>> maxOf(a: T, b: T, c: T): T {
|
||||
return maxOf(a, maxOf(b, c))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Byte, b: Byte, c: Byte): Byte {
|
||||
return Math.max(a.toInt(), b.toInt(), c.toInt()).unsafeCast<Byte>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Short, b: Short, c: Short): Short {
|
||||
return Math.max(a.toInt(), b.toInt(), c.toInt()).unsafeCast<Short>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Int, b: Int, c: Int): Int {
|
||||
return Math.max(a, b, c)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
public actual inline fun maxOf(a: Long, b: Long, c: Long): Long {
|
||||
return maxOf(a, maxOf(b, c))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Float, b: Float, c: Float): Float {
|
||||
return Math.max(a, b, c)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the greater of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun maxOf(a: Double, b: Double, c: Double): Double {
|
||||
return Math.max(a, b, c)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
* If values are equal, returns the first one.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public actual fun <T : Comparable<T>> minOf(a: T, b: T): T {
|
||||
return if (a <= b) a else b
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Byte, b: Byte): Byte {
|
||||
return Math.min(a.toInt(), b.toInt()).unsafeCast<Byte>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Short, b: Short): Short {
|
||||
return Math.min(a.toInt(), b.toInt()).unsafeCast<Short>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Int, b: Int): Int {
|
||||
return Math.min(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@Suppress("DEPRECATION_ERROR", "NOTHING_TO_INLINE")
|
||||
public actual inline fun minOf(a: Long, b: Long): Long {
|
||||
return if (a <= b) a else b
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Float, b: Float): Float {
|
||||
return Math.min(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of two values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Double, b: Double): Double {
|
||||
return Math.min(a, b)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
public actual fun <T : Comparable<T>> minOf(a: T, b: T, c: T): T {
|
||||
return minOf(a, minOf(b, c))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Byte, b: Byte, c: Byte): Byte {
|
||||
return Math.min(a.toInt(), b.toInt(), c.toInt()).unsafeCast<Byte>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Short, b: Short, c: Short): Short {
|
||||
return Math.min(a.toInt(), b.toInt(), c.toInt()).unsafeCast<Short>()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Int, b: Int, c: Int): Int {
|
||||
return Math.min(a, b, c)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
public actual inline fun minOf(a: Long, b: Long, c: Long): Long {
|
||||
return minOf(a, minOf(b, c))
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Float, b: Float, c: Float): Float {
|
||||
return Math.min(a, b, c)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the smaller of three values.
|
||||
*/
|
||||
@SinceKotlin("1.1")
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
public actual inline fun minOf(a: Double, b: Double, c: Double): Double {
|
||||
return Math.min(a, b, c)
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.text
|
||||
|
||||
//
|
||||
// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt
|
||||
// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
|
||||
//
|
||||
|
||||
import kotlin.js.*
|
||||
|
||||
/**
|
||||
* Returns a character at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this char sequence.
|
||||
*
|
||||
* @sample samples.collections.Collections.Elements.elementAt
|
||||
*/
|
||||
public actual fun CharSequence.elementAt(index: Int): Char {
|
||||
return elementAtOrElse(index) { throw IndexOutOfBoundsException("index: $index, length: $length}") }
|
||||
}
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.collections
|
||||
|
||||
//
|
||||
// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt
|
||||
// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib
|
||||
//
|
||||
|
||||
import kotlin.js.*
|
||||
import kotlin.ranges.contains
|
||||
import kotlin.ranges.reversed
|
||||
|
||||
/**
|
||||
* Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this array.
|
||||
*
|
||||
* @sample samples.collections.Collections.Elements.elementAt
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UIntArray.elementAt(index: Int): UInt {
|
||||
return elementAtOrElse(index) { throw IndexOutOfBoundsException("index: $index, size: $size}") }
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this array.
|
||||
*
|
||||
* @sample samples.collections.Collections.Elements.elementAt
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun ULongArray.elementAt(index: Int): ULong {
|
||||
return elementAtOrElse(index) { throw IndexOutOfBoundsException("index: $index, size: $size}") }
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this array.
|
||||
*
|
||||
* @sample samples.collections.Collections.Elements.elementAt
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UByteArray.elementAt(index: Int): UByte {
|
||||
return elementAtOrElse(index) { throw IndexOutOfBoundsException("index: $index, size: $size}") }
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an element at the given [index] or throws an [IndexOutOfBoundsException] if the [index] is out of bounds of this array.
|
||||
*
|
||||
* @sample samples.collections.Collections.Elements.elementAt
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UShortArray.elementAt(index: Int): UShort {
|
||||
return elementAtOrElse(index) { throw IndexOutOfBoundsException("index: $index, size: $size}") }
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a [List] that wraps the original array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UIntArray.asList(): List<UInt> {
|
||||
return object : AbstractList<UInt>(), RandomAccess {
|
||||
override val size: Int get() = this@asList.size
|
||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||
override fun contains(element: UInt): Boolean = this@asList.contains(element)
|
||||
override fun get(index: Int): UInt {
|
||||
AbstractList.checkElementIndex(index, size)
|
||||
return this@asList[index]
|
||||
}
|
||||
override fun indexOf(element: UInt): Int {
|
||||
if ((element as Any?) !is UInt) return -1
|
||||
return this@asList.indexOf(element)
|
||||
}
|
||||
override fun lastIndexOf(element: UInt): Int {
|
||||
if ((element as Any?) !is UInt) return -1
|
||||
return this@asList.lastIndexOf(element)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a [List] that wraps the original array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun ULongArray.asList(): List<ULong> {
|
||||
return object : AbstractList<ULong>(), RandomAccess {
|
||||
override val size: Int get() = this@asList.size
|
||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||
override fun contains(element: ULong): Boolean = this@asList.contains(element)
|
||||
override fun get(index: Int): ULong {
|
||||
AbstractList.checkElementIndex(index, size)
|
||||
return this@asList[index]
|
||||
}
|
||||
override fun indexOf(element: ULong): Int {
|
||||
if ((element as Any?) !is ULong) return -1
|
||||
return this@asList.indexOf(element)
|
||||
}
|
||||
override fun lastIndexOf(element: ULong): Int {
|
||||
if ((element as Any?) !is ULong) return -1
|
||||
return this@asList.lastIndexOf(element)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a [List] that wraps the original array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UByteArray.asList(): List<UByte> {
|
||||
return object : AbstractList<UByte>(), RandomAccess {
|
||||
override val size: Int get() = this@asList.size
|
||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||
override fun contains(element: UByte): Boolean = this@asList.contains(element)
|
||||
override fun get(index: Int): UByte {
|
||||
AbstractList.checkElementIndex(index, size)
|
||||
return this@asList[index]
|
||||
}
|
||||
override fun indexOf(element: UByte): Int {
|
||||
if ((element as Any?) !is UByte) return -1
|
||||
return this@asList.indexOf(element)
|
||||
}
|
||||
override fun lastIndexOf(element: UByte): Int {
|
||||
if ((element as Any?) !is UByte) return -1
|
||||
return this@asList.lastIndexOf(element)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a [List] that wraps the original array.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@ExperimentalUnsignedTypes
|
||||
public actual fun UShortArray.asList(): List<UShort> {
|
||||
return object : AbstractList<UShort>(), RandomAccess {
|
||||
override val size: Int get() = this@asList.size
|
||||
override fun isEmpty(): Boolean = this@asList.isEmpty()
|
||||
override fun contains(element: UShort): Boolean = this@asList.contains(element)
|
||||
override fun get(index: Int): UShort {
|
||||
AbstractList.checkElementIndex(index, size)
|
||||
return this@asList[index]
|
||||
}
|
||||
override fun indexOf(element: UShort): Int {
|
||||
if ((element as Any?) !is UShort) return -1
|
||||
return this@asList.indexOf(element)
|
||||
}
|
||||
override fun lastIndexOf(element: UShort): Int {
|
||||
if ((element as Any?) !is UShort) return -1
|
||||
return this@asList.lastIndexOf(element)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
@PublishedApi
|
||||
internal fun throwUninitializedPropertyAccessException(name: String): Nothing =
|
||||
throw UninitializedPropertyAccessException("lateinit property $name has not been initialized")
|
||||
|
||||
internal fun noWhenBranchMatchedException(): Nothing = throw NoWhenBranchMatchedException()
|
||||
|
||||
|
||||
fun THROW_ISE() {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
fun THROW_CCE() {
|
||||
throw ClassCastException()
|
||||
}
|
||||
fun THROW_NPE() {
|
||||
throw NullPointerException()
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.jvm
|
||||
|
||||
import kotlin.annotation.AnnotationTarget.*
|
||||
|
||||
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
internal annotation class JvmOverloads
|
||||
|
||||
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FILE)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@MustBeDocumented
|
||||
internal annotation class JvmName(public val name: String)
|
||||
|
||||
@Target(AnnotationTarget.FILE)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@MustBeDocumented
|
||||
internal annotation class JvmMultifileClass
|
||||
|
||||
@Target(AnnotationTarget.FILE)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@MustBeDocumented
|
||||
internal annotation class JvmPackageName(val name: String)
|
||||
|
||||
@Target(AnnotationTarget.FIELD)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
@MustBeDocumented
|
||||
internal annotation class JvmField
|
||||
|
||||
|
||||
@Target(FIELD)
|
||||
@MustBeDocumented
|
||||
@OptionalExpectation
|
||||
public expect annotation class Volatile()
|
||||
|
||||
@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
|
||||
@MustBeDocumented
|
||||
@OptionalExpectation
|
||||
public expect annotation class Synchronized()
|
||||
@@ -1,7 +0,0 @@
|
||||
package kotlin
|
||||
|
||||
|
||||
annotation class OptionalExpectationDummy()
|
||||
|
||||
// in order to make the compiler ignore semantics of the real OptionalExpectation
|
||||
typealias OptionalExpectation = OptionalExpectationDummy
|
||||
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
|
||||
// File is a copy of stdlib/js/src/kotlin/kotlin.kt
|
||||
// TODO: Compile arrayPlusCollection
|
||||
// TODO: implement a copy of jsIsType for both JS backends
|
||||
|
||||
@file:Suppress("UNUSED_PARAMETER", "NOTHING_TO_INLINE")
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Returns an empty array of the specified type [T].
|
||||
*/
|
||||
public inline fun <T> emptyArray(): Array<T> = js("[]")
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*/
|
||||
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*
|
||||
* The [mode] parameter is ignored. */
|
||||
public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*
|
||||
* The [lock] parameter is ignored.
|
||||
*/
|
||||
public actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
|
||||
internal fun fillFrom(src: dynamic, dst: dynamic): dynamic {
|
||||
val srcLen: Int = src.length
|
||||
val dstLen: Int = dst.length
|
||||
var index: Int = 0
|
||||
val arr = dst.unsafeCast<Array<Any?>>()
|
||||
while (index < srcLen && index < dstLen) arr[index] = src[index++]
|
||||
return dst
|
||||
}
|
||||
|
||||
|
||||
internal fun arrayCopyResize(source: dynamic, newSize: Int, defaultValue: Any?): dynamic {
|
||||
val result = source.slice(0, newSize).unsafeCast<Array<Any?>>()
|
||||
copyArrayType(source, result)
|
||||
var index: Int = source.length
|
||||
if (newSize > index) {
|
||||
result.asDynamic().length = newSize
|
||||
while (index < newSize) result[index++] = defaultValue
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun <T> arrayPlusCollection(array: dynamic, collection: Collection<T>): dynamic {
|
||||
val result = array.slice().unsafeCast<Array<T>>()
|
||||
result.asDynamic().length = result.size + collection.size
|
||||
copyArrayType(array, result)
|
||||
var index: Int = array.length
|
||||
for (element in collection) result[index++] = element
|
||||
return result
|
||||
}
|
||||
|
||||
internal inline fun copyArrayType(from: dynamic, to: dynamic) {
|
||||
if (from.`$type$` !== undefined) {
|
||||
to.`$type$` = from.`$type$`
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
@PublishedApi
|
||||
internal fun <T : Enum<T>> enumValuesIntrinsic(): Array<T> =
|
||||
throw IllegalStateException("Should be replaced by compiler")
|
||||
|
||||
@PublishedApi
|
||||
internal fun <T : Enum<T>> enumValueOfIntrinsic(name: String): T =
|
||||
throw IllegalStateException("Should be replaced by compiler")
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.native.concurrent
|
||||
|
||||
// Current serialization removes expect declarations, so some dummy annotations are needed
|
||||
// Expect declarations: libraries/stdlib/common/src/kotlin/NativeAnnotationsH.kt
|
||||
|
||||
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS)
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
@OptionalExpectation
|
||||
public annotation class ThreadLocal()
|
||||
|
||||
@Target(AnnotationTarget.PROPERTY)
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
@OptionalExpectation
|
||||
public annotation class SharedImmutable()
|
||||
@@ -1,263 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Represents a 64-bit signed integer.
|
||||
*/
|
||||
public class Long internal constructor(
|
||||
internal val low: Int,
|
||||
internal val high: Int
|
||||
) : Number(), Comparable<Long> {
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* A constant holding the minimum value an instance of Long can have.
|
||||
*/
|
||||
public const val MIN_VALUE: Long = -9223372036854775807L - 1L
|
||||
|
||||
/**
|
||||
* A constant holding the maximum value an instance of Long can have.
|
||||
*/
|
||||
public const val MAX_VALUE: Long = 9223372036854775807L
|
||||
|
||||
/**
|
||||
* The number of bytes used to represent an instance of Long in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BYTES: Int = 8
|
||||
|
||||
/**
|
||||
* The number of bits used to represent an instance of Long in a binary form.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public const val SIZE_BITS: Int = 64
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public inline operator fun compareTo(other: Byte): Int = compareTo(other.toLong())
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public inline operator fun compareTo(other: Short): Int = compareTo(other.toLong())
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public inline operator fun compareTo(other: Int): Int = compareTo(other.toLong())
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public override operator fun compareTo(other: Long): Int = compare(other)
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public inline operator fun compareTo(other: Float): Int = toFloat().compareTo(other)
|
||||
|
||||
/**
|
||||
* Compares this value with the specified value for order.
|
||||
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
|
||||
* or a positive number if it's greater than other.
|
||||
*/
|
||||
public inline operator fun compareTo(other: Double): Int = toDouble().compareTo(other)
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public inline operator fun plus(other: Byte): Long = plus(other.toLong())
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public inline operator fun plus(other: Short): Long = plus(other.toLong())
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public inline operator fun plus(other: Int): Long = plus(other.toLong())
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public operator fun plus(other: Long): Long = add(other)
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public inline operator fun plus(other: Float): Float = toFloat() + other
|
||||
|
||||
/** Adds the other value to this value. */
|
||||
public inline operator fun plus(other: Double): Double = toDouble() + other
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public inline operator fun minus(other: Byte): Long = minus(other.toLong())
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public inline operator fun minus(other: Short): Long = minus(other.toLong())
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public inline operator fun minus(other: Int): Long = minus(other.toLong())
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public operator fun minus(other: Long): Long = subtract(other)
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public inline operator fun minus(other: Float): Float = toFloat() - other
|
||||
|
||||
/** Subtracts the other value from this value. */
|
||||
public inline operator fun minus(other: Double): Double = toDouble() - other
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public inline operator fun times(other: Byte): Long = times(other.toLong())
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public inline operator fun times(other: Short): Long = times(other.toLong())
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public inline operator fun times(other: Int): Long = times(other.toLong())
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public operator fun times(other: Long): Long = multiply(other)
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public inline operator fun times(other: Float): Float = toFloat() * other
|
||||
|
||||
/** Multiplies this value by the other value. */
|
||||
public inline operator fun times(other: Double): Double = toDouble() * other
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public inline operator fun div(other: Byte): Long = div(other.toLong())
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public inline operator fun div(other: Short): Long = div(other.toLong())
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public inline operator fun div(other: Int): Long = div(other.toLong())
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public operator fun div(other: Long): Long = divide(other)
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public inline operator fun div(other: Float): Float = toFloat() / other
|
||||
|
||||
/** Divides this value by the other value. */
|
||||
public inline operator fun div(other: Double): Double = toDouble() / other
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Byte): Long = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Short): Long = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Int): Long = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Long): Long = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Float): Float = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
|
||||
public inline operator fun mod(other: Double): Double = rem(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public inline operator fun rem(other: Byte): Long = rem(other.toLong())
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public inline operator fun rem(other: Short): Long = rem(other.toLong())
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public inline operator fun rem(other: Int): Long = rem(other.toLong())
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public operator fun rem(other: Long): Long = modulo(other)
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public inline operator fun rem(other: Float): Float = toFloat() % other
|
||||
|
||||
/** Calculates the remainder of dividing this value by the other value. */
|
||||
@SinceKotlin("1.1")
|
||||
public inline operator fun rem(other: Double): Double = toDouble() % other
|
||||
|
||||
/** Increments this value. */
|
||||
public operator fun inc(): Long = this + 1L
|
||||
|
||||
/** Decrements this value. */
|
||||
public operator fun dec(): Long = this - 1L
|
||||
|
||||
/** Returns this value. */
|
||||
public inline operator fun unaryPlus(): Long = this
|
||||
|
||||
/** Returns the negative of this value. */
|
||||
public operator fun unaryMinus(): Long = inv() + 1L
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Byte): LongRange = rangeTo(other.toLong())
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Short): LongRange = rangeTo(other.toLong())
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Int): LongRange = rangeTo(other.toLong())
|
||||
|
||||
/** Creates a range from this value to the specified [other] value. */
|
||||
public operator fun rangeTo(other: Long): LongRange = LongRange(this, other)
|
||||
|
||||
/** Shifts this value left by the [bitCount] number of bits. */
|
||||
public infix fun shl(bitCount: Int): Long = shiftLeft(bitCount)
|
||||
|
||||
/** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with copies of the sign bit. */
|
||||
public infix fun shr(bitCount: Int): Long = shiftRight(bitCount)
|
||||
|
||||
/** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with zeros. */
|
||||
public infix fun ushr(bitCount: Int): Long = shiftRightUnsigned(bitCount)
|
||||
|
||||
/** Performs a bitwise AND operation between the two values. */
|
||||
public infix fun and(other: Long): Long = Long(low and other.low, high and other.high)
|
||||
|
||||
/** Performs a bitwise OR operation between the two values. */
|
||||
public infix fun or(other: Long): Long = Long(low or other.low, high or other.high)
|
||||
|
||||
/** Performs a bitwise XOR operation between the two values. */
|
||||
public infix fun xor(other: Long): Long = Long(low xor other.low, high xor other.high)
|
||||
|
||||
/** Inverts the bits in this value. */
|
||||
public fun inv(): Long = Long(low.inv(), high.inv())
|
||||
|
||||
public override fun toByte(): Byte = low.toByte()
|
||||
public override fun toChar(): Char = low.toChar()
|
||||
public override fun toShort(): Short = low.toShort()
|
||||
public override fun toInt(): Int = low
|
||||
public override fun toLong(): Long = this
|
||||
public override fun toFloat(): Float = toDouble().toFloat()
|
||||
public override fun toDouble(): Double = toNumber()
|
||||
|
||||
// This method is used by `toString()`
|
||||
internal fun valueOf() = toDouble()
|
||||
|
||||
override fun equals(other: Any?): Boolean = other is Long && equalsLong(other)
|
||||
|
||||
override fun hashCode(): Int = hashCode(this)
|
||||
|
||||
override fun toString(): String = toString(10)
|
||||
}
|
||||
@@ -1,386 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
|
||||
// Copyright 2009 The Closure Library Authors. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
package kotlin
|
||||
|
||||
internal fun Long.toNumber() = high * TWO_PWR_32_DBL_ + getLowBitsUnsigned()
|
||||
|
||||
internal fun Long.getLowBitsUnsigned() = if (low >= 0) low.toDouble() else TWO_PWR_32_DBL_ + low
|
||||
|
||||
internal fun hashCode(l: Long) = l.low xor l.high
|
||||
|
||||
internal fun Long.toString(radix: Int): String {
|
||||
if (radix < 2 || 36 < radix) {
|
||||
throw Exception("radix out of range: $radix")
|
||||
}
|
||||
|
||||
if (isZero()) {
|
||||
return "0"
|
||||
}
|
||||
|
||||
if (isNegative()) {
|
||||
if (equalsLong(MIN_VALUE)) {
|
||||
// We need to change the Long value before it can be negated, so we remove
|
||||
// the bottom-most digit in this base and then recurse to do the rest.
|
||||
val radixLong = fromInt(radix)
|
||||
val div = div(radixLong)
|
||||
val rem = div.multiply(radixLong).subtract(this).toInt();
|
||||
return js("div.toString(radix) + rem.toString(radix)")
|
||||
} else {
|
||||
return "-${negate().toString()}"
|
||||
}
|
||||
}
|
||||
|
||||
// Do several (6) digits each time through the loop, so as to
|
||||
// minimize the calls to the very expensive emulated div.
|
||||
val radixToPower = fromNumber(js("Math.pow(radix, 6)").unsafeCast<Double>())
|
||||
|
||||
var rem = this
|
||||
var result = ""
|
||||
while (true) {
|
||||
val remDiv = rem.div(radixToPower)
|
||||
val intval = rem.subtract(remDiv.multiply(radixToPower)).toInt()
|
||||
var digits = js("intval.toString(radix)").unsafeCast<String>()
|
||||
|
||||
rem = remDiv
|
||||
if (rem.isZero()) {
|
||||
return digits + result
|
||||
} else {
|
||||
while (js("digits.length").unsafeCast<Int>() < 6) {
|
||||
digits = "0" + digits
|
||||
}
|
||||
result = digits + result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Long.negate() = unaryMinus()
|
||||
|
||||
internal fun Long.isZero() = high == 0 && low == 0
|
||||
|
||||
internal fun Long.isNegative() = high < 0
|
||||
|
||||
internal fun Long.isOdd() = low and 1 == 1
|
||||
|
||||
internal fun Long.equalsLong(other: Long) = high == other.high && low == other.low
|
||||
|
||||
internal fun Long.lessThan(other: Long) = compare(other) < 0
|
||||
|
||||
internal fun Long.lessThanOrEqual(other: Long) = compare(other) <= 0
|
||||
|
||||
internal fun Long.greaterThan(other: Long) = compare(other) > 0
|
||||
|
||||
internal fun Long.greaterThanOrEqual(other: Long) = compare(other) >= 0
|
||||
|
||||
internal fun Long.compare(other: Long): Int {
|
||||
if (equalsLong(other)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
val thisNeg = isNegative();
|
||||
val otherNeg = other.isNegative();
|
||||
|
||||
return when {
|
||||
thisNeg && !otherNeg -> -1
|
||||
!thisNeg && otherNeg -> 1
|
||||
// at this point, the signs are the same, so subtraction will not overflow
|
||||
subtract(other).isNegative() -> -1
|
||||
else -> 1
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Long.add(other: Long): Long {
|
||||
// Divide each number into 4 chunks of 16 bits, and then sum the chunks.
|
||||
|
||||
val a48 = high ushr 16
|
||||
val a32 = high and 0xFFFF
|
||||
val a16 = low ushr 16
|
||||
val a00 = low and 0xFFFF
|
||||
|
||||
val b48 = other.high ushr 16
|
||||
val b32 = other.high and 0xFFFF
|
||||
val b16 = other.low ushr 16
|
||||
val b00 = other.low and 0xFFFF
|
||||
|
||||
var c48 = 0
|
||||
var c32 = 0
|
||||
var c16 = 0
|
||||
var c00 = 0
|
||||
c00 += a00 + b00
|
||||
c16 += c00 ushr 16
|
||||
c00 = c00 and 0xFFFF
|
||||
c16 += a16 + b16
|
||||
c32 += c16 ushr 16
|
||||
c16 = c16 and 0xFFFF
|
||||
c32 += a32 + b32
|
||||
c48 += c32 ushr 16
|
||||
c32 = c32 and 0xFFFF
|
||||
c48 += a48 + b48
|
||||
c48 = c48 and 0xFFFF
|
||||
return Long((c16 shl 16) or c00, (c48 shl 16) or c32)
|
||||
}
|
||||
|
||||
internal fun Long.subtract(other: Long) = add(other.unaryMinus())
|
||||
|
||||
internal fun Long.multiply(other: Long): Long {
|
||||
if (isZero()) {
|
||||
return ZERO
|
||||
} else if (other.isZero()) {
|
||||
return ZERO
|
||||
}
|
||||
|
||||
if (equalsLong(MIN_VALUE)) {
|
||||
return if (other.isOdd()) MIN_VALUE else ZERO
|
||||
} else if (other.equalsLong(MIN_VALUE)) {
|
||||
return if (isOdd()) MIN_VALUE else ZERO
|
||||
}
|
||||
|
||||
if (isNegative()) {
|
||||
return if (other.isNegative()) {
|
||||
negate().multiply(other.negate())
|
||||
} else {
|
||||
negate().multiply(other).negate()
|
||||
}
|
||||
} else if (other.isNegative()) {
|
||||
return multiply(other.negate()).negate()
|
||||
}
|
||||
|
||||
// If both longs are small, use float multiplication
|
||||
if (lessThan(TWO_PWR_24_) && other.lessThan(TWO_PWR_24_)) {
|
||||
return fromNumber(toNumber() * other.toNumber())
|
||||
}
|
||||
|
||||
// Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
|
||||
// We can skip products that would overflow.
|
||||
|
||||
val a48 = high ushr 16
|
||||
val a32 = high and 0xFFFF
|
||||
val a16 = low ushr 16
|
||||
val a00 = low and 0xFFFF
|
||||
|
||||
val b48 = other.high ushr 16
|
||||
val b32 = other.high and 0xFFFF
|
||||
val b16 = other.low ushr 16
|
||||
val b00 = other.low and 0xFFFF
|
||||
|
||||
var c48 = 0
|
||||
var c32 = 0
|
||||
var c16 = 0
|
||||
var c00 = 0
|
||||
c00 += a00 * b00
|
||||
c16 += c00 ushr 16
|
||||
c00 = c00 and 0xFFFF
|
||||
c16 += a16 * b00
|
||||
c32 += c16 ushr 16
|
||||
c16 = c16 and 0xFFFF
|
||||
c16 += a00 * b16
|
||||
c32 += c16 ushr 16
|
||||
c16 = c16 and 0xFFFF
|
||||
c32 += a32 * b00
|
||||
c48 += c32 ushr 16
|
||||
c32 = c32 and 0xFFFF
|
||||
c32 += a16 * b16
|
||||
c48 += c32 ushr 16
|
||||
c32 = c32 and 0xFFFF
|
||||
c32 += a00 * b32
|
||||
c48 += c32 ushr 16
|
||||
c32 = c32 and 0xFFFF
|
||||
c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48
|
||||
c48 = c48 and 0xFFFF
|
||||
return Long(c16 shl 16 or c00, c48 shl 16 or c32)
|
||||
}
|
||||
|
||||
internal fun Long.divide(other: Long): Long {
|
||||
if (other.isZero()) {
|
||||
throw Exception("division by zero")
|
||||
} else if (isZero()) {
|
||||
return ZERO
|
||||
}
|
||||
|
||||
if (equalsLong(MIN_VALUE)) {
|
||||
if (other.equalsLong(ONE) || other.equalsLong(NEG_ONE)) {
|
||||
return MIN_VALUE // recall that -MIN_VALUE == MIN_VALUE
|
||||
} else if (other.equalsLong(MIN_VALUE)) {
|
||||
return ONE
|
||||
} else {
|
||||
// At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
|
||||
val halfThis = shiftRight(1)
|
||||
val approx = halfThis.div(other).shiftLeft(1)
|
||||
if (approx.equalsLong(ZERO)) {
|
||||
return if (other.isNegative()) ONE else NEG_ONE
|
||||
} else {
|
||||
val rem = subtract(other.multiply(approx))
|
||||
return approx.add(rem.div(other))
|
||||
}
|
||||
}
|
||||
} else if (other.equalsLong(MIN_VALUE)) {
|
||||
return ZERO
|
||||
}
|
||||
|
||||
if (isNegative()) {
|
||||
return if (other.isNegative()) {
|
||||
negate().div(other.negate())
|
||||
} else {
|
||||
negate().div(other).negate()
|
||||
}
|
||||
} else if (other.isNegative()) {
|
||||
return div(other.negate()).negate()
|
||||
}
|
||||
|
||||
// Repeat the following until the remainder is less than other: find a
|
||||
// floating-point that approximates remainder / other *from below*, add this
|
||||
// into the result, and subtract it from the remainder. It is critical that
|
||||
// the approximate value is less than or equal to the real value so that the
|
||||
// remainder never becomes negative.
|
||||
var res = ZERO
|
||||
var rem = this
|
||||
while (rem.greaterThanOrEqual(other)) {
|
||||
// Approximate the result of division. This may be a little greater or
|
||||
// smaller than the actual value.
|
||||
val approxDouble = rem.toNumber() / other.toNumber()
|
||||
var approx2 = js("Math.max(1, Math.floor(approxDouble))").unsafeCast<Double>()
|
||||
|
||||
// We will tweak the approximate result by changing it in the 48-th digit or
|
||||
// the smallest non-fractional digit, whichever is larger.
|
||||
val log2 = js("Math.ceil(Math.log(approx2) / Math.LN2)").unsafeCast<Int>()
|
||||
|
||||
// TODO: log2 is renamed but usage in js() functions is not
|
||||
val log2_minus48 = log2 - 48
|
||||
val delta = if (log2 <= 48) 1.0 else js("Math.pow(2, log2_minus48)").unsafeCast<Double>()
|
||||
|
||||
// Decrease the approximation until it is smaller than the remainder. Note
|
||||
// that if it is too large, the product overflows and is negative.
|
||||
var approxRes = fromNumber(approx2)
|
||||
var approxRem = approxRes.multiply(other)
|
||||
while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
|
||||
approx2 -= delta
|
||||
approxRes = fromNumber(approx2)
|
||||
approxRem = approxRes.multiply(other)
|
||||
}
|
||||
|
||||
// We know the answer can't be zero... and actually, zero would cause
|
||||
// infinite recursion since we would make no progress.
|
||||
if (approxRes.isZero()) {
|
||||
approxRes = ONE
|
||||
}
|
||||
|
||||
res = res.add(approxRes)
|
||||
rem = rem.subtract(approxRem)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
internal fun Long.modulo(other: Long) = subtract(div(other).multiply(other))
|
||||
|
||||
internal fun Long.shiftLeft(numBits: Int): Long {
|
||||
val numBits = numBits and 63
|
||||
if (numBits == 0) {
|
||||
return this
|
||||
} else {
|
||||
if (numBits < 32) {
|
||||
return Long(low shl numBits, (high shl numBits) or (low ushr (32 - numBits)))
|
||||
} else {
|
||||
return Long(0, low shl (numBits - 32))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Long.shiftRight(numBits: Int): Long {
|
||||
val numBits = numBits and 63
|
||||
if (numBits == 0) {
|
||||
return this
|
||||
} else {
|
||||
if (numBits < 32) {
|
||||
return Long((low ushr numBits) or (high shl (32 - numBits)), high shr numBits)
|
||||
} else {
|
||||
return Long(high shr (numBits - 32), if (high >= 0) 0 else -1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Long.shiftRightUnsigned(numBits: Int): Long {
|
||||
val numBits = numBits and 63
|
||||
if (numBits == 0) {
|
||||
return this
|
||||
} else {
|
||||
if (numBits < 32) {
|
||||
return Long((low ushr numBits) or (high shl (32 - numBits)), high ushr numBits)
|
||||
} else return if (numBits == 32) {
|
||||
Long(high, 0)
|
||||
} else {
|
||||
Long(high ushr (numBits - 32), 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a Long representing the given (32-bit) integer value.
|
||||
* @param {number} value The 32-bit integer in question.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
// TODO: cache
|
||||
internal fun fromInt(value: Int) = Long(value, if (value < 0) -1 else 0)
|
||||
|
||||
/**
|
||||
* Returns a Long representing the given value, provided that it is a finite
|
||||
* number. Otherwise, zero is returned.
|
||||
* @param {number} value The number in question.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
internal fun fromNumber(value: Double): Long {
|
||||
if (js("isNaN(value)").unsafeCast<Boolean>() || !js("isFinite(value)").unsafeCast<Boolean>()) {
|
||||
return ZERO;
|
||||
} else if (value <= -TWO_PWR_63_DBL_) {
|
||||
return MIN_VALUE;
|
||||
} else if (value + 1 >= TWO_PWR_63_DBL_) {
|
||||
return MAX_VALUE;
|
||||
} else if (value < 0) {
|
||||
return fromNumber(-value).negate();
|
||||
} else {
|
||||
val twoPwr32 = TWO_PWR_32_DBL_
|
||||
return Long(
|
||||
js("(value % twoPwr32) | 0").unsafeCast<Int>(),
|
||||
js("(value / twoPwr32) | 0").unsafeCast<Int>()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private val TWO_PWR_16_DBL_ = (1 shl 16).toDouble()
|
||||
|
||||
private val TWO_PWR_24_DBL_ = (1 shl 24).toDouble()
|
||||
|
||||
//private val TWO_PWR_32_DBL_ = TWO_PWR_16_DBL_ * TWO_PWR_16_DBL_
|
||||
private val TWO_PWR_32_DBL_ = (1 shl 16).toDouble() * (1 shl 16).toDouble()
|
||||
|
||||
//private val TWO_PWR_64_DBL_ = TWO_PWR_32_DBL_ * TWO_PWR_32_DBL_
|
||||
private val TWO_PWR_64_DBL_ = ((1 shl 16).toDouble() * (1 shl 16).toDouble()) * ((1 shl 16).toDouble() * (1 shl 16).toDouble())
|
||||
|
||||
//private val TWO_PWR_63_DBL_ = TWO_PWR_64_DBL_ / 2
|
||||
private val TWO_PWR_63_DBL_ = (((1 shl 16).toDouble() * (1 shl 16).toDouble()) * ((1 shl 16).toDouble() * (1 shl 16).toDouble())) / 2
|
||||
|
||||
private val ZERO = fromInt(0)
|
||||
|
||||
private val ONE = fromInt(1)
|
||||
|
||||
private val NEG_ONE = fromInt(-1)
|
||||
|
||||
private val MAX_VALUE = Long(-1, -1 ushr 1)
|
||||
|
||||
private val MIN_VALUE = Long(0, 1 shl 31)
|
||||
|
||||
private val TWO_PWR_24_ = fromInt(1 shl 24)
|
||||
@@ -1,10 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
// TODO: Polyfill
|
||||
internal fun imul(a_local: Int, b_local: Int) =
|
||||
js("((a_local & 0xffff0000) * (b_local & 0xffff) + (a_local & 0xffff) * (b_local | 0)) | 0").unsafeCast<Int>()
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
/** Concat regular Array's and TypedArray's into an Array.
|
||||
*/
|
||||
@PublishedApi
|
||||
internal fun <T> arrayConcat(vararg args: T): T {
|
||||
val len = args.size
|
||||
val typed = js("Array(len)").unsafeCast<Array<T>>()
|
||||
for (i in 0 .. (len - 1)) {
|
||||
val arr = args[i]
|
||||
if (arr !is Array<*>) {
|
||||
typed[i] = js("[]").slice.call(arr)
|
||||
} else {
|
||||
typed[i] = arr
|
||||
}
|
||||
}
|
||||
return js("[]").concat.apply(js("[]"), typed);
|
||||
}
|
||||
|
||||
/** Concat primitive arrays. Main use: prepare vararg arguments.
|
||||
*/
|
||||
@PublishedApi
|
||||
internal fun <T> primitiveArrayConcat(vararg args: T): T {
|
||||
var size_local = 0
|
||||
for (i in 0 .. (args.size - 1)) {
|
||||
size_local += args[i].unsafeCast<Array<Any?>>().size
|
||||
}
|
||||
val a = args[0]
|
||||
val result = js("new a.constructor(size_local)").unsafeCast<Array<Any?>>()
|
||||
if (a.asDynamic().`$type$` != null) {
|
||||
withType(a.asDynamic().`$type$`, result)
|
||||
}
|
||||
|
||||
size_local = 0
|
||||
for (i in 0 .. (args.size - 1)) {
|
||||
val arr = args[i].unsafeCast<Array<Any?>>()
|
||||
for (j in 0 .. (arr.size - 1)) {
|
||||
result[size_local++] = arr[j]
|
||||
}
|
||||
}
|
||||
return result.unsafeCast<T>()
|
||||
}
|
||||
|
||||
@PublishedApi
|
||||
internal inline fun withType(type: String, array: dynamic): dynamic {
|
||||
array.`$type$` = type
|
||||
return array
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
fun numberToByte(a: dynamic): Byte = toByte(numberToInt(a))
|
||||
|
||||
fun numberToDouble(a: dynamic): Double = js("+a").unsafeCast<Double>()
|
||||
|
||||
fun numberToInt(a: dynamic): Int = if (a is Long) a.toInt() else doubleToInt(a)
|
||||
|
||||
fun numberToShort(a: dynamic): Short = toShort(numberToInt(a))
|
||||
|
||||
// << and >> shifts are used to preserve sign of the number
|
||||
fun toByte(a: dynamic): Byte = js("a << 24 >> 24").unsafeCast<Byte>()
|
||||
fun toShort(a: dynamic): Short = js("a << 16 >> 16").unsafeCast<Short>()
|
||||
|
||||
fun numberToLong(a: dynamic): Long = if (a is Long) a else fromNumber(a)
|
||||
|
||||
fun toLong(a: dynamic): Long = fromInt(a)
|
||||
|
||||
fun doubleToInt(a: dynamic) = js("""
|
||||
if (a > 2147483647) return 2147483647;
|
||||
if (a < -2147483648) return -2147483648;
|
||||
return a | 0;
|
||||
""").unsafeCast<Int>()
|
||||
|
||||
fun numberToChar(a: dynamic) = Char(numberToInt(a) and 0xFFFF)
|
||||
@@ -1,15 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
// Creates IntRange for {Byte, Short, Int}.rangeTo(x: {Byte, Short, Int})
|
||||
fun numberRangeToNumber(start: dynamic, endInclusive: dynamic) =
|
||||
IntRange(start, endInclusive)
|
||||
|
||||
// Create LongRange for {Byte, Short, Int}.rangeTo(x: Long)
|
||||
// Long.rangeTo(x: *) should be implemented in Long class
|
||||
fun numberRangeToLong(start: dynamic, endInclusive: dynamic) =
|
||||
LongRange(numberToLong(start), endInclusive)
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Returns `true` if this char sequence is empty (contains no characters).
|
||||
*/
|
||||
@kotlin.internal.InlineOnly
|
||||
public inline fun CharSequence.isEmpty(): Boolean = length == 0
|
||||
|
||||
/**
|
||||
* Accumulates value starting with [initial] value and applying [operation] from left to right to current accumulator value and each element.
|
||||
*/
|
||||
public inline fun <T, R> Array<out T>.fold(initial: R, operation: (acc: R, T) -> R): R {
|
||||
var accumulator = initial
|
||||
for (element in this) accumulator = operation(accumulator, element)
|
||||
return accumulator
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.test
|
||||
|
||||
// This file plugs some declaration from "kotlin.test" library used in tests.
|
||||
|
||||
fun <T> assertEquals(a: T, b: T) {
|
||||
if (a != b) throw Exception("")
|
||||
}
|
||||
|
||||
fun assertTrue(x: Boolean) {
|
||||
if (!x) throw Exception("")
|
||||
}
|
||||
|
||||
fun assertFalse(x: Boolean) {
|
||||
if (x) throw Exception("")
|
||||
}
|
||||
|
||||
fun <T : Any> assertNotNull(actual: T?, message: String? = null): T {
|
||||
if (actual == null) throw Exception("")
|
||||
return actual
|
||||
}
|
||||
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
private external interface Metadata {
|
||||
val interfaces: Array<Ctor>
|
||||
}
|
||||
|
||||
private external interface Ctor {
|
||||
val `$metadata$`: Metadata?
|
||||
val prototype: Ctor?
|
||||
}
|
||||
|
||||
private fun isInterfaceImpl(ctor: Ctor, iface: dynamic): Boolean {
|
||||
if (ctor === iface) return true
|
||||
|
||||
val metadata = ctor.`$metadata$`
|
||||
if (metadata != null) {
|
||||
val interfaces = metadata.interfaces
|
||||
for (i in interfaces) {
|
||||
if (isInterfaceImpl(i, iface)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val superPrototype = if (ctor.prototype != null) js("Object").getPrototypeOf(ctor.prototype) else null
|
||||
val superConstructor: Ctor? = if (superPrototype != null) superPrototype.constructor else null
|
||||
return superConstructor != null && isInterfaceImpl(superConstructor, iface)
|
||||
}
|
||||
|
||||
public fun isInterface(obj: dynamic, iface: dynamic): Boolean {
|
||||
//TODO: val ctor = obj.constructor
|
||||
val ctor = js("obj.constructor")
|
||||
|
||||
if (ctor == null) return false
|
||||
|
||||
return isInterfaceImpl(ctor, iface)
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
internal interface ClassMetadata {
|
||||
val simpleName: String
|
||||
val interfaces: Array<dynamic>
|
||||
}
|
||||
|
||||
// TODO: replace `isInterface` with the following
|
||||
public fun isInterface(ctor: dynamic, IType: dynamic): Boolean {
|
||||
if (ctor === IType) return true
|
||||
|
||||
val metadata = ctor.`$metadata$`.unsafeCast<ClassMetadata?>()
|
||||
|
||||
if (metadata !== null) {
|
||||
val interfaces = metadata.interfaces
|
||||
for (i in interfaces) {
|
||||
if (isInterface(i, IType)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var superPrototype = ctor.prototype
|
||||
if (superPrototype !== null) {
|
||||
superPrototype = js("Object.getPrototypeOf(superPrototype)")
|
||||
}
|
||||
|
||||
val superConstructor = if (superPrototype !== null) {
|
||||
superPrototype.constructor
|
||||
} else null
|
||||
|
||||
return superConstructor != null && isInterface(superConstructor, IType)
|
||||
}
|
||||
*/
|
||||
|
||||
fun typeOf(obj: dynamic): String = js("typeof obj").unsafeCast<String>()
|
||||
|
||||
fun jsTypeOf(obj: Any?): String = js("typeof obj").unsafeCast<String>()
|
||||
|
||||
fun instanceOf(obj: dynamic, jsClass_local: dynamic) = js("obj instanceof jsClass_local").unsafeCast<Boolean>()
|
||||
|
||||
fun isObject(obj: dynamic): Boolean {
|
||||
val objTypeOf = typeOf(obj)
|
||||
|
||||
return when (objTypeOf) {
|
||||
"string" -> true
|
||||
"number" -> true
|
||||
"boolean" -> true
|
||||
"function" -> true
|
||||
else -> js("obj instanceof Object").unsafeCast<Boolean>()
|
||||
}
|
||||
}
|
||||
|
||||
private fun isJsArray(obj: Any): Boolean {
|
||||
return js("Array.isArray(obj)").unsafeCast<Boolean>()
|
||||
}
|
||||
|
||||
public fun isArray(obj: Any): Boolean {
|
||||
return isJsArray(obj) && js("!obj.\$type\$").unsafeCast<Boolean>()
|
||||
}
|
||||
|
||||
public fun isArrayish(o: dynamic) =
|
||||
isJsArray(o) || js("ArrayBuffer.isView(o)").unsafeCast<Boolean>()
|
||||
|
||||
|
||||
public fun isChar(c: Any): Boolean {
|
||||
return js("throw Error(\"isChar is not implemented\")").unsafeCast<Boolean>()
|
||||
}
|
||||
|
||||
// TODO: Distinguish Boolean/Byte and Short/Char
|
||||
public fun isBooleanArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "BooleanArray"
|
||||
public fun isByteArray(a: dynamic): Boolean = js("a instanceof Int8Array").unsafeCast<Boolean>()
|
||||
public fun isShortArray(a: dynamic): Boolean = js("a instanceof Int16Array").unsafeCast<Boolean>()
|
||||
public fun isCharArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "CharArray"
|
||||
public fun isIntArray(a: dynamic): Boolean = js("a instanceof Int32Array").unsafeCast<Boolean>()
|
||||
public fun isFloatArray(a: dynamic): Boolean = js("a instanceof Float32Array").unsafeCast<Boolean>()
|
||||
public fun isDoubleArray(a: dynamic): Boolean = js("a instanceof Float64Array").unsafeCast<Boolean>()
|
||||
public fun isLongArray(a: dynamic): Boolean = isJsArray(a) && a.`$type$` == "LongArray"
|
||||
|
||||
|
||||
internal fun jsIn(x: String, y: dynamic): Boolean = js("x in y")
|
||||
internal fun jsGetPrototypeOf(jsClass: dynamic) = js("Object").getPrototypeOf(jsClass)
|
||||
|
||||
public fun jsIsType(obj: dynamic, jsClass: dynamic): Boolean {
|
||||
if (jsClass === js("Object")) {
|
||||
return isObject(obj)
|
||||
}
|
||||
|
||||
if (obj == null || jsClass == null || (typeOf(obj) != "object" && typeOf(obj) != "function")) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (typeOf(jsClass) == "function" && instanceOf(obj, jsClass)) {
|
||||
return true
|
||||
}
|
||||
|
||||
var proto = jsGetPrototypeOf(jsClass)
|
||||
var constructor = proto?.constructor
|
||||
if (constructor != null && jsIn("${'$'}metadata${'$'}", constructor)) {
|
||||
var metadata = constructor.`$metadata$`
|
||||
if (metadata.kind === "object") {
|
||||
return obj === jsClass
|
||||
}
|
||||
}
|
||||
|
||||
var klassMetadata = jsClass.`$metadata$`
|
||||
|
||||
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
|
||||
if (klassMetadata == null) {
|
||||
return instanceOf(obj, jsClass)
|
||||
}
|
||||
|
||||
if (klassMetadata.kind === "interface" && obj.constructor != null) {
|
||||
return isInterfaceImpl(obj.constructor, jsClass)
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
fun isNumber(a: dynamic) = jsTypeOf(a) == "number" || a is Long
|
||||
|
||||
fun isComparable(value: dynamic): Boolean {
|
||||
var type = jsTypeOf(value)
|
||||
|
||||
return type == "string" ||
|
||||
type == "boolean" ||
|
||||
isNumber(value) ||
|
||||
isInterface(value, Comparable::class.js)
|
||||
}
|
||||
|
||||
fun isCharSequence(value: dynamic): Boolean =
|
||||
jsTypeOf(value) == "string" || isInterface(value, CharSequence::class.js)
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin
|
||||
|
||||
public class Enum<T : Enum<T>> : Comparable<Enum<T>> {
|
||||
@JsName("name$") private var _name: String = ""
|
||||
@JsName("ordinal$") private var _ordinal: Int = 0
|
||||
|
||||
val name: String
|
||||
get() = _name
|
||||
|
||||
val ordinal: Int
|
||||
get() = _ordinal
|
||||
|
||||
override fun compareTo(other: Enum<T>) = ordinal.compareTo(other.ordinal)
|
||||
|
||||
override fun equals(other: Any?) = this === other
|
||||
|
||||
override fun hashCode(): Int = js("Kotlin.identityHashCode")(this)
|
||||
|
||||
override fun toString() = name
|
||||
|
||||
companion object
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
@file:Suppress("WRONG_EXTERNAL_DECLARATION")
|
||||
package kotlin.js
|
||||
|
||||
import kotlin.annotation.AnnotationTarget.*
|
||||
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
@Target(CLASS, FUNCTION, PROPERTY, CONSTRUCTOR, PROPERTY_GETTER, PROPERTY_SETTER)
|
||||
internal external annotation class JsName(val name: String)
|
||||
|
||||
internal external annotation class native
|
||||
|
||||
external fun js(code: String): dynamic
|
||||
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.isBooleanArray = function (a) {
|
||||
return (Array.isArray(a) || a instanceof Int8Array) && a.$type$ === "BooleanArray"
|
||||
};
|
||||
|
||||
Kotlin.isByteArray = function (a) {
|
||||
return a instanceof Int8Array && a.$type$ !== "BooleanArray"
|
||||
};
|
||||
|
||||
Kotlin.isShortArray = function (a) {
|
||||
return a instanceof Int16Array
|
||||
};
|
||||
|
||||
Kotlin.isCharArray = function (a) {
|
||||
return a instanceof Uint16Array && a.$type$ === "CharArray"
|
||||
};
|
||||
|
||||
Kotlin.isIntArray = function (a) {
|
||||
return a instanceof Int32Array
|
||||
};
|
||||
|
||||
Kotlin.isFloatArray = function (a) {
|
||||
return a instanceof Float32Array
|
||||
};
|
||||
|
||||
Kotlin.isDoubleArray = function (a) {
|
||||
return a instanceof Float64Array
|
||||
};
|
||||
|
||||
Kotlin.isLongArray = function (a) {
|
||||
return Array.isArray(a) && a.$type$ === "LongArray"
|
||||
};
|
||||
|
||||
Kotlin.isArray = function (a) {
|
||||
return Array.isArray(a) && !a.$type$;
|
||||
};
|
||||
|
||||
Kotlin.isArrayish = function (a) {
|
||||
return Array.isArray(a) || ArrayBuffer.isView(a)
|
||||
};
|
||||
|
||||
Kotlin.arrayToString = function (a) {
|
||||
var toString = Kotlin.isCharArray(a) ? String.fromCharCode : Kotlin.toString;
|
||||
return "[" + Array.prototype.map.call(a, function(e) { return toString(e); }).join(", ") + "]";
|
||||
};
|
||||
|
||||
Kotlin.arrayDeepToString = function (arr) {
|
||||
return Kotlin.kotlin.collections.contentDeepToStringImpl(arr);
|
||||
};
|
||||
|
||||
Kotlin.arrayEquals = function (a, b) {
|
||||
if (a === b) {
|
||||
return true;
|
||||
}
|
||||
if (!Kotlin.isArrayish(b) || a.length !== b.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (var i = 0, n = a.length; i < n; i++) {
|
||||
if (!Kotlin.equals(a[i], b[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
Kotlin.arrayDeepEquals = function (a, b) {
|
||||
return Kotlin.kotlin.collections.contentDeepEqualsImpl(a, b);
|
||||
};
|
||||
|
||||
Kotlin.arrayHashCode = function (arr) {
|
||||
var result = 1;
|
||||
for (var i = 0, n = arr.length; i < n; i++) {
|
||||
result = ((31 * result | 0) + Kotlin.hashCode(arr[i])) | 0;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
Kotlin.arrayDeepHashCode = function (arr) {
|
||||
return Kotlin.kotlin.collections.contentDeepHashCodeImpl(arr);
|
||||
};
|
||||
|
||||
Kotlin.primitiveArraySort = function (array) {
|
||||
array.sort(Kotlin.doubleCompareTo)
|
||||
};
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.getCallableRef = function(name, f) {
|
||||
f.callableName = name;
|
||||
return f;
|
||||
};
|
||||
|
||||
Kotlin.getPropertyCallableRef = function(name, paramCount, getter, setter) {
|
||||
getter.get = getter;
|
||||
getter.set = setter;
|
||||
getter.callableName = name;
|
||||
return getPropertyRefClass(getter, setter, propertyRefClassMetadataCache[paramCount]);
|
||||
};
|
||||
|
||||
function getPropertyRefClass(obj, setter, cache) {
|
||||
obj.$metadata$ = getPropertyRefMetadata(typeof setter === "function" ? cache.mutable : cache.immutable);
|
||||
obj.constructor = obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
var propertyRefClassMetadataCache = [
|
||||
{
|
||||
mutable: { value: null, implementedInterface: function () {
|
||||
return Kotlin.kotlin.reflect.KMutableProperty0 }
|
||||
},
|
||||
immutable: { value: null, implementedInterface: function () {
|
||||
return Kotlin.kotlin.reflect.KProperty0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
mutable: { value: null, implementedInterface: function () {
|
||||
return Kotlin.kotlin.reflect.KMutableProperty1 }
|
||||
},
|
||||
immutable: { value: null, implementedInterface: function () {
|
||||
return Kotlin.kotlin.reflect.KProperty1 }
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
function getPropertyRefMetadata(cache) {
|
||||
if (cache.value === null) {
|
||||
cache.value = {
|
||||
interfaces: [cache.implementedInterface()],
|
||||
baseClass: null,
|
||||
functions: {},
|
||||
properties: {},
|
||||
types: {},
|
||||
staticMembers: {}
|
||||
};
|
||||
}
|
||||
return cache.value;
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.toShort = function (a) {
|
||||
return (a & 0xFFFF) << 16 >> 16;
|
||||
};
|
||||
|
||||
Kotlin.toByte = function (a) {
|
||||
return (a & 0xFF) << 24 >> 24;
|
||||
};
|
||||
|
||||
Kotlin.toChar = function (a) {
|
||||
return a & 0xFFFF;
|
||||
};
|
||||
|
||||
Kotlin.numberToLong = function (a) {
|
||||
return a instanceof Kotlin.Long ? a : Kotlin.Long.fromNumber(a);
|
||||
};
|
||||
|
||||
Kotlin.numberToInt = function (a) {
|
||||
return a instanceof Kotlin.Long ? a.toInt() : Kotlin.doubleToInt(a);
|
||||
};
|
||||
|
||||
Kotlin.numberToShort = function (a) {
|
||||
return Kotlin.toShort(Kotlin.numberToInt(a));
|
||||
};
|
||||
|
||||
Kotlin.numberToByte = function (a) {
|
||||
return Kotlin.toByte(Kotlin.numberToInt(a));
|
||||
};
|
||||
|
||||
Kotlin.numberToDouble = function (a) {
|
||||
return +a;
|
||||
};
|
||||
|
||||
Kotlin.numberToChar = function (a) {
|
||||
return Kotlin.toChar(Kotlin.numberToInt(a));
|
||||
};
|
||||
|
||||
Kotlin.doubleToInt = function(a) {
|
||||
if (a > 2147483647) return 2147483647;
|
||||
if (a < -2147483648) return -2147483648;
|
||||
return a | 0;
|
||||
};
|
||||
|
||||
Kotlin.toBoxedChar = function (a) {
|
||||
if (a == null) return a;
|
||||
if (a instanceof Kotlin.BoxedChar) return a;
|
||||
return new Kotlin.BoxedChar(a);
|
||||
};
|
||||
|
||||
Kotlin.unboxChar = function(a) {
|
||||
if (a == null) return a;
|
||||
return Kotlin.toChar(a);
|
||||
};
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.equals = function (obj1, obj2) {
|
||||
if (obj1 == null) {
|
||||
return obj2 == null;
|
||||
}
|
||||
|
||||
if (obj2 == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (obj1 !== obj1) {
|
||||
return obj2 !== obj2;
|
||||
}
|
||||
|
||||
if (typeof obj1 === "object" && typeof obj1.equals === "function") {
|
||||
return obj1.equals(obj2);
|
||||
}
|
||||
|
||||
if (typeof obj1 === "number" && typeof obj2 === "number") {
|
||||
return obj1 === obj2 && (obj1 !== 0 || 1 / obj1 === 1 / obj2)
|
||||
}
|
||||
|
||||
return obj1 === obj2;
|
||||
};
|
||||
|
||||
Kotlin.hashCode = function (obj) {
|
||||
if (obj == null) {
|
||||
return 0;
|
||||
}
|
||||
var objType = typeof obj;
|
||||
if ("object" === objType) {
|
||||
return "function" === typeof obj.hashCode ? obj.hashCode() : getObjectHashCode(obj);
|
||||
}
|
||||
if ("function" === objType) {
|
||||
return getObjectHashCode(obj);
|
||||
}
|
||||
if ("number" === objType) {
|
||||
return Kotlin.numberHashCode(obj);
|
||||
}
|
||||
if ("boolean" === objType) {
|
||||
return Number(obj)
|
||||
}
|
||||
|
||||
var str = String(obj);
|
||||
return getStringHashCode(str);
|
||||
};
|
||||
|
||||
|
||||
Kotlin.toString = function (o) {
|
||||
if (o == null) {
|
||||
return "null";
|
||||
}
|
||||
else if (Kotlin.isArrayish(o)) {
|
||||
return "[...]";
|
||||
}
|
||||
else {
|
||||
return o.toString();
|
||||
}
|
||||
};
|
||||
|
||||
/** @const */
|
||||
var POW_2_32 = 4294967296;
|
||||
// TODO: consider switching to Symbol type once we are on ES6.
|
||||
/** @const */
|
||||
var OBJECT_HASH_CODE_PROPERTY_NAME = "kotlinHashCodeValue$";
|
||||
|
||||
function getObjectHashCode(obj) {
|
||||
if (!(OBJECT_HASH_CODE_PROPERTY_NAME in obj)) {
|
||||
var hash = (Math.random() * POW_2_32) | 0; // Make 32-bit singed integer.
|
||||
Object.defineProperty(obj, OBJECT_HASH_CODE_PROPERTY_NAME, { value: hash, enumerable: false });
|
||||
}
|
||||
return obj[OBJECT_HASH_CODE_PROPERTY_NAME];
|
||||
}
|
||||
|
||||
function getStringHashCode(str) {
|
||||
var hash = 0;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
var code = str.charCodeAt(i);
|
||||
hash = (hash * 31 + code) | 0; // Keep it 32-bit.
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
Kotlin.identityHashCode = getObjectHashCode;
|
||||
@@ -1,835 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
// Copyright 2009 The Closure Library Authors. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
/**
|
||||
* Constructs a 64-bit two's-complement integer, given its low and high 32-bit
|
||||
* values as *signed* integers. See the from* functions below for more
|
||||
* convenient ways of constructing Longs.
|
||||
*
|
||||
* The internal representation of a long is the two given signed, 32-bit values.
|
||||
* We use 32-bit pieces because these are the size of integers on which
|
||||
* Javascript performs bit-operations. For operations like addition and
|
||||
* multiplication, we split each number into 16-bit pieces, which can easily be
|
||||
* multiplied within Javascript's floating-point representation without overflow
|
||||
* or change in sign.
|
||||
*
|
||||
* In the algorithms below, we frequently reduce the negative case to the
|
||||
* positive case by negating the input(s) and then post-processing the result.
|
||||
* Note that we must ALWAYS check specially whether those values are MIN_VALUE
|
||||
* (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
|
||||
* a positive number, it overflows back into a negative). Not handling this
|
||||
* case would often result in infinite recursion.
|
||||
*
|
||||
* @param {number} low The low (signed) 32 bits of the long.
|
||||
* @param {number} high The high (signed) 32 bits of the long.
|
||||
* @constructor
|
||||
* @final
|
||||
*/
|
||||
Kotlin.Long = function(low, high) {
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
this.low_ = low | 0; // force into 32 signed bits.
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
this.high_ = high | 0; // force into 32 signed bits.
|
||||
};
|
||||
|
||||
Kotlin.Long.$metadata$ = {
|
||||
kind: "class",
|
||||
simpleName: "Long",
|
||||
interfaces:[]
|
||||
};
|
||||
|
||||
|
||||
// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
|
||||
// from* methods on which they depend.
|
||||
|
||||
|
||||
/**
|
||||
* A cache of the Long representations of small integer values.
|
||||
* @type {!Object}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.IntCache_ = {};
|
||||
|
||||
|
||||
/**
|
||||
* Returns a Long representing the given (32-bit) integer value.
|
||||
* @param {number} value The 32-bit integer in question.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
Kotlin.Long.fromInt = function(value) {
|
||||
if (-128 <= value && value < 128) {
|
||||
var cachedObj = Kotlin.Long.IntCache_[value];
|
||||
if (cachedObj) {
|
||||
return cachedObj;
|
||||
}
|
||||
}
|
||||
|
||||
var obj = new Kotlin.Long(value | 0, value < 0 ? -1 : 0);
|
||||
if (-128 <= value && value < 128) {
|
||||
Kotlin.Long.IntCache_[value] = obj;
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns a Long representing the given value, provided that it is a finite
|
||||
* number. Otherwise, zero is returned.
|
||||
* @param {number} value The number in question.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
Kotlin.Long.fromNumber = function(value) {
|
||||
if (isNaN(value) || !isFinite(value)) {
|
||||
return Kotlin.Long.ZERO;
|
||||
} else if (value <= -Kotlin.Long.TWO_PWR_63_DBL_) {
|
||||
return Kotlin.Long.MIN_VALUE;
|
||||
} else if (value + 1 >= Kotlin.Long.TWO_PWR_63_DBL_) {
|
||||
return Kotlin.Long.MAX_VALUE;
|
||||
} else if (value < 0) {
|
||||
return Kotlin.Long.fromNumber(-value).negate();
|
||||
} else {
|
||||
return new Kotlin.Long(
|
||||
(value % Kotlin.Long.TWO_PWR_32_DBL_) | 0,
|
||||
(value / Kotlin.Long.TWO_PWR_32_DBL_) | 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns a Long representing the 64-bit integer that comes by concatenating
|
||||
* the given high and low bits. Each is assumed to use 32 bits.
|
||||
* @param {number} lowBits The low 32-bits.
|
||||
* @param {number} highBits The high 32-bits.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
Kotlin.Long.fromBits = function(lowBits, highBits) {
|
||||
return new Kotlin.Long(lowBits, highBits);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns a Long representation of the given string, written using the given
|
||||
* radix.
|
||||
* @param {string} str The textual representation of the Long.
|
||||
* @param {number=} opt_radix The radix in which the text is written.
|
||||
* @return {!Kotlin.Long} The corresponding Long value.
|
||||
*/
|
||||
Kotlin.Long.fromString = function(str, opt_radix) {
|
||||
if (str.length == 0) {
|
||||
throw Error('number format error: empty string');
|
||||
}
|
||||
|
||||
var radix = opt_radix || 10;
|
||||
if (radix < 2 || 36 < radix) {
|
||||
throw Error('radix out of range: ' + radix);
|
||||
}
|
||||
|
||||
if (str.charAt(0) == '-') {
|
||||
return Kotlin.Long.fromString(str.substring(1), radix).negate();
|
||||
} else if (str.indexOf('-') >= 0) {
|
||||
throw Error('number format error: interior "-" character: ' + str);
|
||||
}
|
||||
|
||||
// Do several (8) digits each time through the loop, so as to
|
||||
// minimize the calls to the very expensive emulated div.
|
||||
var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 8));
|
||||
|
||||
var result = Kotlin.Long.ZERO;
|
||||
for (var i = 0; i < str.length; i += 8) {
|
||||
var size = Math.min(8, str.length - i);
|
||||
var value = parseInt(str.substring(i, i + size), radix);
|
||||
if (size < 8) {
|
||||
var power = Kotlin.Long.fromNumber(Math.pow(radix, size));
|
||||
result = result.multiply(power).add(Kotlin.Long.fromNumber(value));
|
||||
} else {
|
||||
result = result.multiply(radixToPower);
|
||||
result = result.add(Kotlin.Long.fromNumber(value));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
// NOTE: the compiler should inline these constant values below and then remove
|
||||
// these variables, so there should be no runtime penalty for these.
|
||||
|
||||
|
||||
/**
|
||||
* Number used repeated below in calculations. This must appear before the
|
||||
* first call to any from* function below.
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_16_DBL_ = 1 << 16;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_24_DBL_ = 1 << 24;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_32_DBL_ =
|
||||
Kotlin.Long.TWO_PWR_16_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_31_DBL_ =
|
||||
Kotlin.Long.TWO_PWR_32_DBL_ / 2;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_48_DBL_ =
|
||||
Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_64_DBL_ =
|
||||
Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_32_DBL_;
|
||||
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_63_DBL_ =
|
||||
Kotlin.Long.TWO_PWR_64_DBL_ / 2;
|
||||
|
||||
|
||||
/** @type {!Kotlin.Long} */
|
||||
Kotlin.Long.ZERO = Kotlin.Long.fromInt(0);
|
||||
|
||||
|
||||
/** @type {!Kotlin.Long} */
|
||||
Kotlin.Long.ONE = Kotlin.Long.fromInt(1);
|
||||
|
||||
|
||||
/** @type {!Kotlin.Long} */
|
||||
Kotlin.Long.NEG_ONE = Kotlin.Long.fromInt(-1);
|
||||
|
||||
|
||||
/** @type {!Kotlin.Long} */
|
||||
Kotlin.Long.MAX_VALUE =
|
||||
Kotlin.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);
|
||||
|
||||
|
||||
/** @type {!Kotlin.Long} */
|
||||
Kotlin.Long.MIN_VALUE = Kotlin.Long.fromBits(0, 0x80000000 | 0);
|
||||
|
||||
|
||||
/**
|
||||
* @type {!Kotlin.Long}
|
||||
* @private
|
||||
*/
|
||||
Kotlin.Long.TWO_PWR_24_ = Kotlin.Long.fromInt(1 << 24);
|
||||
|
||||
|
||||
/** @return {number} The value, assuming it is a 32-bit integer. */
|
||||
Kotlin.Long.prototype.toInt = function() {
|
||||
return this.low_;
|
||||
};
|
||||
|
||||
|
||||
/** @return {number} The closest floating-point representation to this value. */
|
||||
Kotlin.Long.prototype.toNumber = function() {
|
||||
return this.high_ * Kotlin.Long.TWO_PWR_32_DBL_ +
|
||||
this.getLowBitsUnsigned();
|
||||
};
|
||||
|
||||
/** @return {number} The 32-bit hashCode of this value. */
|
||||
Kotlin.Long.prototype.hashCode = function() {
|
||||
return this.high_ ^ this.low_;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {number=} opt_radix The radix in which the text should be written.
|
||||
* @return {string} The textual representation of this value.
|
||||
* @override
|
||||
*/
|
||||
Kotlin.Long.prototype.toString = function(opt_radix) {
|
||||
var radix = opt_radix || 10;
|
||||
if (radix < 2 || 36 < radix) {
|
||||
throw Error('radix out of range: ' + radix);
|
||||
}
|
||||
|
||||
if (this.isZero()) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
if (this.isNegative()) {
|
||||
if (this.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
// We need to change the Long value before it can be negated, so we remove
|
||||
// the bottom-most digit in this base and then recurse to do the rest.
|
||||
var radixLong = Kotlin.Long.fromNumber(radix);
|
||||
var div = this.div(radixLong);
|
||||
var rem = div.multiply(radixLong).subtract(this);
|
||||
return div.toString(radix) + rem.toInt().toString(radix);
|
||||
} else {
|
||||
return '-' + this.negate().toString(radix);
|
||||
}
|
||||
}
|
||||
|
||||
// Do several (6) digits each time through the loop, so as to
|
||||
// minimize the calls to the very expensive emulated div.
|
||||
var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 6));
|
||||
|
||||
var rem = this;
|
||||
var result = '';
|
||||
while (true) {
|
||||
var remDiv = rem.div(radixToPower);
|
||||
var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();
|
||||
var digits = intval.toString(radix);
|
||||
|
||||
rem = remDiv;
|
||||
if (rem.isZero()) {
|
||||
return digits + result;
|
||||
} else {
|
||||
while (digits.length < 6) {
|
||||
digits = '0' + digits;
|
||||
}
|
||||
result = '' + digits + result;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** @return {number} The high 32-bits as a signed value. */
|
||||
Kotlin.Long.prototype.getHighBits = function() {
|
||||
return this.high_;
|
||||
};
|
||||
|
||||
|
||||
/** @return {number} The low 32-bits as a signed value. */
|
||||
Kotlin.Long.prototype.getLowBits = function() {
|
||||
return this.low_;
|
||||
};
|
||||
|
||||
|
||||
/** @return {number} The low 32-bits as an unsigned value. */
|
||||
Kotlin.Long.prototype.getLowBitsUnsigned = function() {
|
||||
return (this.low_ >= 0) ?
|
||||
this.low_ : Kotlin.Long.TWO_PWR_32_DBL_ + this.low_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {number} Returns the number of bits needed to represent the absolute
|
||||
* value of this Long.
|
||||
*/
|
||||
Kotlin.Long.prototype.getNumBitsAbs = function() {
|
||||
if (this.isNegative()) {
|
||||
if (this.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return 64;
|
||||
} else {
|
||||
return this.negate().getNumBitsAbs();
|
||||
}
|
||||
} else {
|
||||
var val = this.high_ != 0 ? this.high_ : this.low_;
|
||||
for (var bit = 31; bit > 0; bit--) {
|
||||
if ((val & (1 << bit)) != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this.high_ != 0 ? bit + 33 : bit + 1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** @return {boolean} Whether this value is zero. */
|
||||
Kotlin.Long.prototype.isZero = function() {
|
||||
return this.high_ == 0 && this.low_ == 0;
|
||||
};
|
||||
|
||||
|
||||
/** @return {boolean} Whether this value is negative. */
|
||||
Kotlin.Long.prototype.isNegative = function() {
|
||||
return this.high_ < 0;
|
||||
};
|
||||
|
||||
|
||||
/** @return {boolean} Whether this value is odd. */
|
||||
Kotlin.Long.prototype.isOdd = function() {
|
||||
return (this.low_ & 1) == 1;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long equals the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.equalsLong = function(other) {
|
||||
return (this.high_ == other.high_) && (this.low_ == other.low_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long does not equal the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.notEqualsLong = function(other) {
|
||||
return (this.high_ != other.high_) || (this.low_ != other.low_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long is less than the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.lessThan = function(other) {
|
||||
return this.compare(other) < 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long is less than or equal to the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.lessThanOrEqual = function(other) {
|
||||
return this.compare(other) <= 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long is greater than the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.greaterThan = function(other) {
|
||||
return this.compare(other) > 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {boolean} Whether this Long is greater than or equal to the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.greaterThanOrEqual = function(other) {
|
||||
return this.compare(other) >= 0;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Compares this Long with the given one.
|
||||
* @param {Kotlin.Long} other Long to compare against.
|
||||
* @return {number} 0 if they are the same, 1 if the this is greater, and -1
|
||||
* if the given one is greater.
|
||||
*/
|
||||
Kotlin.Long.prototype.compare = function(other) {
|
||||
if (this.equalsLong(other)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var thisNeg = this.isNegative();
|
||||
var otherNeg = other.isNegative();
|
||||
if (thisNeg && !otherNeg) {
|
||||
return -1;
|
||||
}
|
||||
if (!thisNeg && otherNeg) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// at this point, the signs are the same, so subtraction will not overflow
|
||||
if (this.subtract(other).isNegative()) {
|
||||
return -1;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** @return {!Kotlin.Long} The negation of this value. */
|
||||
Kotlin.Long.prototype.negate = function() {
|
||||
if (this.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return Kotlin.Long.MIN_VALUE;
|
||||
} else {
|
||||
return this.not().add(Kotlin.Long.ONE);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the sum of this and the given Long.
|
||||
* @param {Kotlin.Long} other Long to add to this one.
|
||||
* @return {!Kotlin.Long} The sum of this and the given Long.
|
||||
*/
|
||||
Kotlin.Long.prototype.add = function(other) {
|
||||
// Divide each number into 4 chunks of 16 bits, and then sum the chunks.
|
||||
|
||||
var a48 = this.high_ >>> 16;
|
||||
var a32 = this.high_ & 0xFFFF;
|
||||
var a16 = this.low_ >>> 16;
|
||||
var a00 = this.low_ & 0xFFFF;
|
||||
|
||||
var b48 = other.high_ >>> 16;
|
||||
var b32 = other.high_ & 0xFFFF;
|
||||
var b16 = other.low_ >>> 16;
|
||||
var b00 = other.low_ & 0xFFFF;
|
||||
|
||||
var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
|
||||
c00 += a00 + b00;
|
||||
c16 += c00 >>> 16;
|
||||
c00 &= 0xFFFF;
|
||||
c16 += a16 + b16;
|
||||
c32 += c16 >>> 16;
|
||||
c16 &= 0xFFFF;
|
||||
c32 += a32 + b32;
|
||||
c48 += c32 >>> 16;
|
||||
c32 &= 0xFFFF;
|
||||
c48 += a48 + b48;
|
||||
c48 &= 0xFFFF;
|
||||
return Kotlin.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the difference of this and the given Long.
|
||||
* @param {Kotlin.Long} other Long to subtract from this.
|
||||
* @return {!Kotlin.Long} The difference of this and the given Long.
|
||||
*/
|
||||
Kotlin.Long.prototype.subtract = function(other) {
|
||||
return this.add(other.negate());
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the product of this and the given long.
|
||||
* @param {Kotlin.Long} other Long to multiply with this.
|
||||
* @return {!Kotlin.Long} The product of this and the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.multiply = function(other) {
|
||||
if (this.isZero()) {
|
||||
return Kotlin.Long.ZERO;
|
||||
} else if (other.isZero()) {
|
||||
return Kotlin.Long.ZERO;
|
||||
}
|
||||
|
||||
if (this.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return other.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO;
|
||||
} else if (other.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return this.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO;
|
||||
}
|
||||
|
||||
if (this.isNegative()) {
|
||||
if (other.isNegative()) {
|
||||
return this.negate().multiply(other.negate());
|
||||
} else {
|
||||
return this.negate().multiply(other).negate();
|
||||
}
|
||||
} else if (other.isNegative()) {
|
||||
return this.multiply(other.negate()).negate();
|
||||
}
|
||||
|
||||
// If both longs are small, use float multiplication
|
||||
if (this.lessThan(Kotlin.Long.TWO_PWR_24_) &&
|
||||
other.lessThan(Kotlin.Long.TWO_PWR_24_)) {
|
||||
return Kotlin.Long.fromNumber(this.toNumber() * other.toNumber());
|
||||
}
|
||||
|
||||
// Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
|
||||
// We can skip products that would overflow.
|
||||
|
||||
var a48 = this.high_ >>> 16;
|
||||
var a32 = this.high_ & 0xFFFF;
|
||||
var a16 = this.low_ >>> 16;
|
||||
var a00 = this.low_ & 0xFFFF;
|
||||
|
||||
var b48 = other.high_ >>> 16;
|
||||
var b32 = other.high_ & 0xFFFF;
|
||||
var b16 = other.low_ >>> 16;
|
||||
var b00 = other.low_ & 0xFFFF;
|
||||
|
||||
var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
|
||||
c00 += a00 * b00;
|
||||
c16 += c00 >>> 16;
|
||||
c00 &= 0xFFFF;
|
||||
c16 += a16 * b00;
|
||||
c32 += c16 >>> 16;
|
||||
c16 &= 0xFFFF;
|
||||
c16 += a00 * b16;
|
||||
c32 += c16 >>> 16;
|
||||
c16 &= 0xFFFF;
|
||||
c32 += a32 * b00;
|
||||
c48 += c32 >>> 16;
|
||||
c32 &= 0xFFFF;
|
||||
c32 += a16 * b16;
|
||||
c48 += c32 >>> 16;
|
||||
c32 &= 0xFFFF;
|
||||
c32 += a00 * b32;
|
||||
c48 += c32 >>> 16;
|
||||
c32 &= 0xFFFF;
|
||||
c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
|
||||
c48 &= 0xFFFF;
|
||||
return Kotlin.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns this Long divided by the given one.
|
||||
* @param {Kotlin.Long} other Long by which to divide.
|
||||
* @return {!Kotlin.Long} This Long divided by the given one.
|
||||
*/
|
||||
Kotlin.Long.prototype.div = function(other) {
|
||||
if (other.isZero()) {
|
||||
throw Error('division by zero');
|
||||
} else if (this.isZero()) {
|
||||
return Kotlin.Long.ZERO;
|
||||
}
|
||||
|
||||
if (this.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
if (other.equalsLong(Kotlin.Long.ONE) ||
|
||||
other.equalsLong(Kotlin.Long.NEG_ONE)) {
|
||||
return Kotlin.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE
|
||||
} else if (other.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return Kotlin.Long.ONE;
|
||||
} else {
|
||||
// At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
|
||||
var halfThis = this.shiftRight(1);
|
||||
var approx = halfThis.div(other).shiftLeft(1);
|
||||
if (approx.equalsLong(Kotlin.Long.ZERO)) {
|
||||
return other.isNegative() ? Kotlin.Long.ONE : Kotlin.Long.NEG_ONE;
|
||||
} else {
|
||||
var rem = this.subtract(other.multiply(approx));
|
||||
var result = approx.add(rem.div(other));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
} else if (other.equalsLong(Kotlin.Long.MIN_VALUE)) {
|
||||
return Kotlin.Long.ZERO;
|
||||
}
|
||||
|
||||
if (this.isNegative()) {
|
||||
if (other.isNegative()) {
|
||||
return this.negate().div(other.negate());
|
||||
} else {
|
||||
return this.negate().div(other).negate();
|
||||
}
|
||||
} else if (other.isNegative()) {
|
||||
return this.div(other.negate()).negate();
|
||||
}
|
||||
|
||||
// Repeat the following until the remainder is less than other: find a
|
||||
// floating-point that approximates remainder / other *from below*, add this
|
||||
// into the result, and subtract it from the remainder. It is critical that
|
||||
// the approximate value is less than or equal to the real value so that the
|
||||
// remainder never becomes negative.
|
||||
var res = Kotlin.Long.ZERO;
|
||||
var rem = this;
|
||||
while (rem.greaterThanOrEqual(other)) {
|
||||
// Approximate the result of division. This may be a little greater or
|
||||
// smaller than the actual value.
|
||||
var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
|
||||
|
||||
// We will tweak the approximate result by changing it in the 48-th digit or
|
||||
// the smallest non-fractional digit, whichever is larger.
|
||||
var log2 = Math.ceil(Math.log(approx) / Math.LN2);
|
||||
var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
|
||||
|
||||
// Decrease the approximation until it is smaller than the remainder. Note
|
||||
// that if it is too large, the product overflows and is negative.
|
||||
var approxRes = Kotlin.Long.fromNumber(approx);
|
||||
var approxRem = approxRes.multiply(other);
|
||||
while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
|
||||
approx -= delta;
|
||||
approxRes = Kotlin.Long.fromNumber(approx);
|
||||
approxRem = approxRes.multiply(other);
|
||||
}
|
||||
|
||||
// We know the answer can't be zero... and actually, zero would cause
|
||||
// infinite recursion since we would make no progress.
|
||||
if (approxRes.isZero()) {
|
||||
approxRes = Kotlin.Long.ONE;
|
||||
}
|
||||
|
||||
res = res.add(approxRes);
|
||||
rem = rem.subtract(approxRem);
|
||||
}
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns this Long modulo the given one.
|
||||
* @param {Kotlin.Long} other Long by which to mod.
|
||||
* @return {!Kotlin.Long} This Long modulo the given one.
|
||||
*/
|
||||
Kotlin.Long.prototype.modulo = function(other) {
|
||||
return this.subtract(this.div(other).multiply(other));
|
||||
};
|
||||
|
||||
|
||||
/** @return {!Kotlin.Long} The bitwise-NOT of this value. */
|
||||
Kotlin.Long.prototype.not = function() {
|
||||
return Kotlin.Long.fromBits(~this.low_, ~this.high_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the bitwise-AND of this Long and the given one.
|
||||
* @param {Kotlin.Long} other The Long with which to AND.
|
||||
* @return {!Kotlin.Long} The bitwise-AND of this and the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.and = function(other) {
|
||||
return Kotlin.Long.fromBits(this.low_ & other.low_,
|
||||
this.high_ & other.high_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the bitwise-OR of this Long and the given one.
|
||||
* @param {Kotlin.Long} other The Long with which to OR.
|
||||
* @return {!Kotlin.Long} The bitwise-OR of this and the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.or = function(other) {
|
||||
return Kotlin.Long.fromBits(this.low_ | other.low_,
|
||||
this.high_ | other.high_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns the bitwise-XOR of this Long and the given one.
|
||||
* @param {Kotlin.Long} other The Long with which to XOR.
|
||||
* @return {!Kotlin.Long} The bitwise-XOR of this and the other.
|
||||
*/
|
||||
Kotlin.Long.prototype.xor = function(other) {
|
||||
return Kotlin.Long.fromBits(this.low_ ^ other.low_,
|
||||
this.high_ ^ other.high_);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns this Long with bits shifted to the left by the given amount.
|
||||
* @param {number} numBits The number of bits by which to shift.
|
||||
* @return {!Kotlin.Long} This shifted to the left by the given amount.
|
||||
*/
|
||||
Kotlin.Long.prototype.shiftLeft = function(numBits) {
|
||||
numBits &= 63;
|
||||
if (numBits == 0) {
|
||||
return this;
|
||||
} else {
|
||||
var low = this.low_;
|
||||
if (numBits < 32) {
|
||||
var high = this.high_;
|
||||
return Kotlin.Long.fromBits(
|
||||
low << numBits,
|
||||
(high << numBits) | (low >>> (32 - numBits)));
|
||||
} else {
|
||||
return Kotlin.Long.fromBits(0, low << (numBits - 32));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns this Long with bits shifted to the right by the given amount.
|
||||
* @param {number} numBits The number of bits by which to shift.
|
||||
* @return {!Kotlin.Long} This shifted to the right by the given amount.
|
||||
*/
|
||||
Kotlin.Long.prototype.shiftRight = function(numBits) {
|
||||
numBits &= 63;
|
||||
if (numBits == 0) {
|
||||
return this;
|
||||
} else {
|
||||
var high = this.high_;
|
||||
if (numBits < 32) {
|
||||
var low = this.low_;
|
||||
return Kotlin.Long.fromBits(
|
||||
(low >>> numBits) | (high << (32 - numBits)),
|
||||
high >> numBits);
|
||||
} else {
|
||||
return Kotlin.Long.fromBits(
|
||||
high >> (numBits - 32),
|
||||
high >= 0 ? 0 : -1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Returns this Long with bits shifted to the right by the given amount, with
|
||||
* zeros placed into the new leading bits.
|
||||
* @param {number} numBits The number of bits by which to shift.
|
||||
* @return {!Kotlin.Long} This shifted to the right by the given amount, with
|
||||
* zeros placed into the new leading bits.
|
||||
*/
|
||||
Kotlin.Long.prototype.shiftRightUnsigned = function(numBits) {
|
||||
numBits &= 63;
|
||||
if (numBits == 0) {
|
||||
return this;
|
||||
} else {
|
||||
var high = this.high_;
|
||||
if (numBits < 32) {
|
||||
var low = this.low_;
|
||||
return Kotlin.Long.fromBits(
|
||||
(low >>> numBits) | (high << (32 - numBits)),
|
||||
high >>> numBits);
|
||||
} else if (numBits == 32) {
|
||||
return Kotlin.Long.fromBits(high, 0);
|
||||
} else {
|
||||
return Kotlin.Long.fromBits(high >>> (numBits - 32), 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Support for Kotlin
|
||||
Kotlin.Long.prototype.equals = function (other) {
|
||||
return other instanceof Kotlin.Long && this.equalsLong(other);
|
||||
};
|
||||
|
||||
Kotlin.Long.prototype.compareTo_11rb$ = Kotlin.Long.prototype.compare;
|
||||
|
||||
Kotlin.Long.prototype.inc = function() {
|
||||
return this.add(Kotlin.Long.ONE);
|
||||
};
|
||||
|
||||
Kotlin.Long.prototype.dec = function() {
|
||||
return this.add(Kotlin.Long.NEG_ONE);
|
||||
};
|
||||
|
||||
Kotlin.Long.prototype.valueOf = function() {
|
||||
return this.toNumber();
|
||||
};
|
||||
|
||||
Kotlin.Long.prototype.unaryPlus = function() {
|
||||
return this;
|
||||
};
|
||||
|
||||
Kotlin.Long.prototype.unaryMinus = Kotlin.Long.prototype.negate;
|
||||
Kotlin.Long.prototype.inv = Kotlin.Long.prototype.not;
|
||||
|
||||
Kotlin.Long.prototype.rangeTo = function (other) {
|
||||
return new Kotlin.kotlin.ranges.LongRange(this, other);
|
||||
};
|
||||
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {string} id
|
||||
* @param {Object} declaration
|
||||
*/
|
||||
Kotlin.defineModule = function (id, declaration) {
|
||||
};
|
||||
|
||||
Kotlin.defineInlineFunction = function(tag, fun) {
|
||||
return fun;
|
||||
};
|
||||
|
||||
Kotlin.wrapFunction = function(fun) {
|
||||
var f = function() {
|
||||
f = fun();
|
||||
return f.apply(this, arguments);
|
||||
};
|
||||
return function() {
|
||||
return f.apply(this, arguments);
|
||||
};
|
||||
};
|
||||
|
||||
Kotlin.isTypeOf = function(type) {
|
||||
return function (object) {
|
||||
return typeof object === type;
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.isInstanceOf = function (klass) {
|
||||
return function (object) {
|
||||
return Kotlin.isType(object, klass);
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.orNull = function (fn) {
|
||||
return function (object) {
|
||||
return object == null || fn(object);
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.andPredicate = function (a, b) {
|
||||
return function (object) {
|
||||
return a(object) && b(object);
|
||||
}
|
||||
};
|
||||
|
||||
Kotlin.kotlinModuleMetadata = function (abiVersion, moduleName, data) {
|
||||
};
|
||||
|
||||
Kotlin.suspendCall = function(value) {
|
||||
return value;
|
||||
};
|
||||
|
||||
Kotlin.coroutineResult = function(qualifier) {
|
||||
throwMarkerError();
|
||||
};
|
||||
|
||||
Kotlin.coroutineController = function(qualifier) {
|
||||
throwMarkerError();
|
||||
};
|
||||
|
||||
Kotlin.coroutineReceiver = function(qualifier) {
|
||||
throwMarkerError();
|
||||
};
|
||||
|
||||
Kotlin.setCoroutineResult = function(value, qualifier) {
|
||||
throwMarkerError();
|
||||
};
|
||||
|
||||
function throwMarkerError() {
|
||||
throw new Error(
|
||||
"This marker function should never been called. " +
|
||||
"Looks like compiler did not eliminate it properly. " +
|
||||
"Please, report an issue if you caught this exception.");
|
||||
}
|
||||
|
||||
Kotlin.getFunctionById = function(id, defaultValue) {
|
||||
return function() {
|
||||
return defaultValue;
|
||||
}
|
||||
};
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.compareTo = function (a, b) {
|
||||
var typeA = typeof a;
|
||||
if (typeA === "number") {
|
||||
if (typeof b === "number") {
|
||||
return Kotlin.doubleCompareTo(a, b);
|
||||
}
|
||||
return Kotlin.primitiveCompareTo(a, b);
|
||||
}
|
||||
if (typeA === "string" || typeA === "boolean") {
|
||||
return Kotlin.primitiveCompareTo(a, b);
|
||||
}
|
||||
return a.compareTo_11rb$(b);
|
||||
};
|
||||
|
||||
Kotlin.primitiveCompareTo = function (a, b) {
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
};
|
||||
|
||||
Kotlin.doubleCompareTo = function (a, b) {
|
||||
if (a < b) return -1;
|
||||
if (a > b) return 1;
|
||||
|
||||
if (a === b) {
|
||||
if (a !== 0) return 0;
|
||||
|
||||
var ia = 1 / a;
|
||||
return ia === 1 / b ? 0 : (ia < 0 ? -1 : 1);
|
||||
}
|
||||
|
||||
return a !== a ? (b !== b ? 0 : 1) : -1
|
||||
};
|
||||
|
||||
Kotlin.charInc = function (value) {
|
||||
return Kotlin.toChar(value+1);
|
||||
};
|
||||
|
||||
Kotlin.charDec = function (value) {
|
||||
return Kotlin.toChar(value-1);
|
||||
};
|
||||
|
||||
Kotlin.imul = Math.imul || imul;
|
||||
|
||||
Kotlin.imulEmulated = imul;
|
||||
|
||||
function imul(a, b) {
|
||||
return ((a & 0xffff0000) * (b & 0xffff) + (a & 0xffff) * (b | 0)) | 0;
|
||||
}
|
||||
|
||||
(function() {
|
||||
var buf = new ArrayBuffer(8);
|
||||
var bufFloat64 = new Float64Array(buf);
|
||||
var bufFloat32 = new Float32Array(buf);
|
||||
var bufInt32 = new Int32Array(buf);
|
||||
var lowIndex = 0;
|
||||
var highIndex = 1;
|
||||
|
||||
bufFloat64[0] = -1; // bff00000_00000000
|
||||
if (bufInt32[lowIndex] !== 0) {
|
||||
lowIndex = 1;
|
||||
highIndex = 0;
|
||||
}
|
||||
|
||||
Kotlin.doubleToBits = function(value) {
|
||||
return Kotlin.doubleToRawBits(isNaN(value) ? NaN : value);
|
||||
};
|
||||
|
||||
Kotlin.doubleToRawBits = function(value) {
|
||||
bufFloat64[0] = value;
|
||||
return Kotlin.Long.fromBits(bufInt32[lowIndex], bufInt32[highIndex]);
|
||||
};
|
||||
|
||||
Kotlin.doubleFromBits = function(value) {
|
||||
bufInt32[lowIndex] = value.low_;
|
||||
bufInt32[highIndex] = value.high_;
|
||||
return bufFloat64[0];
|
||||
};
|
||||
|
||||
Kotlin.floatToBits = function(value) {
|
||||
return Kotlin.floatToRawBits(isNaN(value) ? NaN : value);
|
||||
};
|
||||
|
||||
Kotlin.floatToRawBits = function(value) {
|
||||
bufFloat32[0] = value;
|
||||
return bufInt32[0];
|
||||
};
|
||||
|
||||
Kotlin.floatFromBits = function(value) {
|
||||
bufInt32[0] = value;
|
||||
return bufFloat32[0];
|
||||
};
|
||||
|
||||
// returns zero value for number with positive sign bit and non-zero value for number with negative sign bit.
|
||||
Kotlin.doubleSignBit = function(value) {
|
||||
bufFloat64[0] = value;
|
||||
return bufInt32[highIndex] & 0x80000000;
|
||||
};
|
||||
|
||||
Kotlin.numberHashCode = function(obj) {
|
||||
if ((obj | 0) === obj) {
|
||||
return obj | 0;
|
||||
}
|
||||
else {
|
||||
bufFloat64[0] = obj;
|
||||
return (bufInt32[highIndex] * 31 | 0) + bufInt32[lowIndex] | 0;
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
Kotlin.ensureNotNull = function(x) {
|
||||
return x != null ? x : Kotlin.throwNPE();
|
||||
};
|
||||
@@ -1,316 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
if (typeof String.prototype.startsWith === "undefined") {
|
||||
String.prototype.startsWith = function(searchString, position) {
|
||||
position = position || 0;
|
||||
return this.lastIndexOf(searchString, position) === position;
|
||||
};
|
||||
}
|
||||
if (typeof String.prototype.endsWith === "undefined") {
|
||||
String.prototype.endsWith = function(searchString, position) {
|
||||
var subjectString = this.toString();
|
||||
if (position === undefined || position > subjectString.length) {
|
||||
position = subjectString.length;
|
||||
}
|
||||
position -= searchString.length;
|
||||
var lastIndex = subjectString.indexOf(searchString, position);
|
||||
return lastIndex !== -1 && lastIndex === position;
|
||||
};
|
||||
}
|
||||
// ES6 Math polyfills
|
||||
if (typeof Math.sign === "undefined") {
|
||||
Math.sign = function(x) {
|
||||
x = +x; // convert to a number
|
||||
if (x === 0 || isNaN(x)) {
|
||||
return Number(x);
|
||||
}
|
||||
return x > 0 ? 1 : -1;
|
||||
};
|
||||
}
|
||||
if (typeof Math.trunc === "undefined") {
|
||||
Math.trunc = function(x) {
|
||||
if (isNaN(x)) {
|
||||
return NaN;
|
||||
}
|
||||
if (x > 0) {
|
||||
return Math.floor(x);
|
||||
}
|
||||
return Math.ceil(x);
|
||||
};
|
||||
}
|
||||
|
||||
(function() {
|
||||
var epsilon = 2.220446049250313E-16;
|
||||
var taylor_2_bound = Math.sqrt(epsilon);
|
||||
var taylor_n_bound = Math.sqrt(taylor_2_bound);
|
||||
var upper_taylor_2_bound = 1/taylor_2_bound;
|
||||
var upper_taylor_n_bound = 1/taylor_n_bound;
|
||||
|
||||
if (typeof Math.sinh === "undefined") {
|
||||
Math.sinh = function(x) {
|
||||
if (Math.abs(x) < taylor_n_bound) {
|
||||
var result = x;
|
||||
if (Math.abs(x) > taylor_2_bound) {
|
||||
result += (x * x * x) / 6;
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
var y = Math.exp(x);
|
||||
var y1 = 1 / y;
|
||||
if (!isFinite(y)) return Math.exp(x - Math.LN2);
|
||||
if (!isFinite(y1)) return -Math.exp(-x - Math.LN2);
|
||||
return (y - y1) / 2;
|
||||
}
|
||||
};
|
||||
}
|
||||
if (typeof Math.cosh === "undefined") {
|
||||
Math.cosh = function(x) {
|
||||
var y = Math.exp(x);
|
||||
var y1 = 1 / y;
|
||||
if (!isFinite(y) || !isFinite(y1)) return Math.exp(Math.abs(x) - Math.LN2);
|
||||
return (y + y1) / 2;
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof Math.tanh === "undefined") {
|
||||
Math.tanh = function(x){
|
||||
if (Math.abs(x) < taylor_n_bound) {
|
||||
var result = x;
|
||||
if (Math.abs(x) > taylor_2_bound) {
|
||||
result -= (x * x * x) / 3;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
var a = Math.exp(+x), b = Math.exp(-x);
|
||||
return a === Infinity ? 1 : b === Infinity ? -1 : (a - b) / (a + b);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Inverse hyperbolic function implementations derived from boost special math functions,
|
||||
// Copyright Eric Ford & Hubert Holin 2001.
|
||||
|
||||
if (typeof Math.asinh === "undefined") {
|
||||
var asinh = function(x) {
|
||||
if (x >= +taylor_n_bound)
|
||||
{
|
||||
if (x > upper_taylor_n_bound)
|
||||
{
|
||||
if (x > upper_taylor_2_bound)
|
||||
{
|
||||
// approximation by laurent series in 1/x at 0+ order from -1 to 0
|
||||
return Math.log(x) + Math.LN2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// approximation by laurent series in 1/x at 0+ order from -1 to 1
|
||||
return Math.log(x * 2 + (1 / (x * 2)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return Math.log(x + Math.sqrt(x * x + 1));
|
||||
}
|
||||
}
|
||||
else if (x <= -taylor_n_bound)
|
||||
{
|
||||
return -asinh(-x);
|
||||
}
|
||||
else
|
||||
{
|
||||
// approximation by taylor series in x at 0 up to order 2
|
||||
var result = x;
|
||||
if (Math.abs(x) >= taylor_2_bound)
|
||||
{
|
||||
var x3 = x * x * x;
|
||||
// approximation by taylor series in x at 0 up to order 4
|
||||
result -= x3 / 6;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
Math.asinh = asinh;
|
||||
}
|
||||
if (typeof Math.acosh === "undefined") {
|
||||
Math.acosh = function(x) {
|
||||
if (x < 1)
|
||||
{
|
||||
return NaN;
|
||||
}
|
||||
else if (x - 1 >= taylor_n_bound)
|
||||
{
|
||||
if (x > upper_taylor_2_bound)
|
||||
{
|
||||
// approximation by laurent series in 1/x at 0+ order from -1 to 0
|
||||
return Math.log(x) + Math.LN2;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Math.log(x + Math.sqrt(x * x - 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var y = Math.sqrt(x - 1);
|
||||
// approximation by taylor series in y at 0 up to order 2
|
||||
var result = y;
|
||||
if (y >= taylor_2_bound)
|
||||
{
|
||||
var y3 = y * y * y;
|
||||
// approximation by taylor series in y at 0 up to order 4
|
||||
result -= y3 / 12;
|
||||
}
|
||||
|
||||
return Math.sqrt(2) * result;
|
||||
}
|
||||
};
|
||||
}
|
||||
if (typeof Math.atanh === "undefined") {
|
||||
Math.atanh = function(x) {
|
||||
if (Math.abs(x) < taylor_n_bound) {
|
||||
var result = x;
|
||||
if (Math.abs(x) > taylor_2_bound) {
|
||||
result += (x * x * x) / 3;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return Math.log((1 + x) / (1 - x)) / 2;
|
||||
};
|
||||
}
|
||||
if (typeof Math.log1p === "undefined") {
|
||||
Math.log1p = function(x) {
|
||||
if (Math.abs(x) < taylor_n_bound) {
|
||||
var x2 = x * x;
|
||||
var x3 = x2 * x;
|
||||
var x4 = x3 * x;
|
||||
// approximation by taylor series in x at 0 up to order 4
|
||||
return (-x4 / 4 + x3 / 3 - x2 / 2 + x);
|
||||
}
|
||||
return Math.log(x + 1);
|
||||
};
|
||||
}
|
||||
if (typeof Math.expm1 === "undefined") {
|
||||
Math.expm1 = function(x) {
|
||||
if (Math.abs(x) < taylor_n_bound) {
|
||||
var x2 = x * x;
|
||||
var x3 = x2 * x;
|
||||
var x4 = x3 * x;
|
||||
// approximation by taylor series in x at 0 up to order 4
|
||||
return (x4 / 24 + x3 / 6 + x2 / 2 + x);
|
||||
}
|
||||
return Math.exp(x) - 1;
|
||||
};
|
||||
}
|
||||
})();
|
||||
if (typeof Math.hypot === "undefined") {
|
||||
Math.hypot = function() {
|
||||
var y = 0;
|
||||
var length = arguments.length;
|
||||
|
||||
for (var i = 0; i < length; i++) {
|
||||
if (arguments[i] === Infinity || arguments[i] === -Infinity) {
|
||||
return Infinity;
|
||||
}
|
||||
y += arguments[i] * arguments[i];
|
||||
}
|
||||
return Math.sqrt(y);
|
||||
};
|
||||
}
|
||||
if (typeof Math.log10 === "undefined") {
|
||||
Math.log10 = function(x) {
|
||||
return Math.log(x) * Math.LOG10E;
|
||||
};
|
||||
}
|
||||
if (typeof Math.log2 === "undefined") {
|
||||
Math.log2 = function(x) {
|
||||
return Math.log(x) * Math.LOG2E;
|
||||
};
|
||||
}
|
||||
|
||||
// For HtmlUnit and PhantomJs
|
||||
if (typeof ArrayBuffer.isView === "undefined") {
|
||||
ArrayBuffer.isView = function(a) {
|
||||
return a != null && a.__proto__ != null && a.__proto__.__proto__ === Int8Array.prototype.__proto__;
|
||||
};
|
||||
}
|
||||
|
||||
(function() {
|
||||
function normalizeOffset(offset, length) {
|
||||
if (offset < 0) return Math.max(0, offset + length);
|
||||
return Math.min(offset, length);
|
||||
}
|
||||
function typedArraySlice(begin, end) {
|
||||
if (typeof end === "undefined") {
|
||||
end = this.length;
|
||||
}
|
||||
begin = normalizeOffset(begin || 0, this.length);
|
||||
end = Math.max(begin, normalizeOffset(end, this.length));
|
||||
return new this.constructor(this.subarray(begin, end));
|
||||
}
|
||||
|
||||
var arrays = [Int8Array, Int16Array, Uint16Array, Int32Array, Float32Array, Float64Array];
|
||||
for (var i = 0; i < arrays.length; ++i) {
|
||||
var TypedArray = arrays[i];
|
||||
if (typeof TypedArray.prototype.slice === "undefined") {
|
||||
Object.defineProperty(TypedArray.prototype, 'slice', {
|
||||
value: typedArraySlice
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Patch apply to work with TypedArrays if needed.
|
||||
try {
|
||||
(function() {}).apply(null, new Int32Array(0))
|
||||
} catch (e) {
|
||||
var apply = Function.prototype.apply;
|
||||
Object.defineProperty(Function.prototype, 'apply', {
|
||||
value: function(self, array) {
|
||||
return apply.call(this, self, [].slice.call(array));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Patch map to work with TypedArrays if needed.
|
||||
for (var i = 0; i < arrays.length; ++i) {
|
||||
var TypedArray = arrays[i];
|
||||
if (typeof TypedArray.prototype.map === "undefined") {
|
||||
Object.defineProperty(TypedArray.prototype, 'map', {
|
||||
value: function(callback, self) {
|
||||
return [].slice.call(this).map(callback, self);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Patch sort to work with TypedArrays if needed.
|
||||
// TODO: consider to remove following function and replace it with `Kotlin.doubleCompareTo` (see misc.js)
|
||||
var totalOrderComparator = function (a, b) {
|
||||
if (a < b) return -1;
|
||||
if (a > b) return 1;
|
||||
|
||||
if (a === b) {
|
||||
if (a !== 0) return 0;
|
||||
|
||||
var ia = 1 / a;
|
||||
return ia === 1 / b ? 0 : (ia < 0 ? -1 : 1);
|
||||
}
|
||||
|
||||
return a !== a ? (b !== b ? 0 : 1) : -1
|
||||
};
|
||||
|
||||
for (var i = 0; i < arrays.length; ++i) {
|
||||
var TypedArray = arrays[i];
|
||||
if (typeof TypedArray.prototype.sort === "undefined") {
|
||||
Object.defineProperty(TypedArray.prototype, 'sort', {
|
||||
value: function(compareFunction) {
|
||||
return Array.prototype.sort.call(this, compareFunction || totalOrderComparator);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -1,129 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
Kotlin.Kind = {
|
||||
CLASS: "class",
|
||||
INTERFACE: "interface",
|
||||
OBJECT: "object"
|
||||
};
|
||||
|
||||
Kotlin.callGetter = function (thisObject, klass, propertyName) {
|
||||
var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName);
|
||||
if (propertyDescriptor != null && propertyDescriptor.get != null) {
|
||||
return propertyDescriptor.get.call(thisObject);
|
||||
}
|
||||
|
||||
propertyDescriptor = Object.getOwnPropertyDescriptor(thisObject, propertyName);
|
||||
if (propertyDescriptor != null && "value" in propertyDescriptor) {
|
||||
return thisObject[propertyName];
|
||||
}
|
||||
|
||||
return Kotlin.callGetter(thisObject, Object.getPrototypeOf(klass), propertyName);
|
||||
};
|
||||
|
||||
Kotlin.callSetter = function (thisObject, klass, propertyName, value) {
|
||||
var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName);
|
||||
if (propertyDescriptor != null && propertyDescriptor.set != null) {
|
||||
propertyDescriptor.set.call(thisObject, value);
|
||||
return;
|
||||
}
|
||||
|
||||
propertyDescriptor = Object.getOwnPropertyDescriptor(thisObject, propertyName);
|
||||
if (propertyDescriptor != null && "value" in propertyDescriptor) {
|
||||
thisObject[propertyName] = value;
|
||||
return
|
||||
}
|
||||
|
||||
Kotlin.callSetter(thisObject, Object.getPrototypeOf(klass), propertyName, value);
|
||||
};
|
||||
|
||||
function isInheritanceFromInterface(ctor, iface) {
|
||||
if (ctor === iface) return true;
|
||||
|
||||
var metadata = ctor.$metadata$;
|
||||
if (metadata != null) {
|
||||
var interfaces = metadata.interfaces;
|
||||
for (var i = 0; i < interfaces.length; i++) {
|
||||
if (isInheritanceFromInterface(interfaces[i], iface)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var superPrototype = ctor.prototype != null ? Object.getPrototypeOf(ctor.prototype) : null;
|
||||
var superConstructor = superPrototype != null ? superPrototype.constructor : null;
|
||||
return superConstructor != null && isInheritanceFromInterface(superConstructor, iface);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} object
|
||||
* @param {Function|Object} klass
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
Kotlin.isType = function (object, klass) {
|
||||
if (klass === Object) {
|
||||
switch (typeof object) {
|
||||
case "string":
|
||||
case "number":
|
||||
case "boolean":
|
||||
case "function":
|
||||
return true;
|
||||
default:
|
||||
return object instanceof Object;
|
||||
}
|
||||
}
|
||||
|
||||
if (object == null || klass == null || (typeof object !== 'object' && typeof object !== 'function')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeof klass === "function" && object instanceof klass) {
|
||||
return true;
|
||||
}
|
||||
|
||||
var proto = Object.getPrototypeOf(klass);
|
||||
var constructor = proto != null ? proto.constructor : null;
|
||||
if (constructor != null && "$metadata$" in constructor) {
|
||||
var metadata = constructor.$metadata$;
|
||||
if (metadata.kind === Kotlin.Kind.OBJECT) {
|
||||
return object === klass;
|
||||
}
|
||||
}
|
||||
|
||||
var klassMetadata = klass.$metadata$;
|
||||
|
||||
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
|
||||
if (klassMetadata == null) {
|
||||
return object instanceof klass;
|
||||
}
|
||||
|
||||
if (klassMetadata.kind === Kotlin.Kind.INTERFACE && object.constructor != null) {
|
||||
return isInheritanceFromInterface(object.constructor, klass);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
Kotlin.isNumber = function (a) {
|
||||
return typeof a == "number" || a instanceof Kotlin.Long;
|
||||
};
|
||||
|
||||
Kotlin.isChar = function (value) {
|
||||
return value instanceof Kotlin.BoxedChar
|
||||
};
|
||||
|
||||
Kotlin.isComparable = function (value) {
|
||||
var type = typeof value;
|
||||
|
||||
return type === "string" ||
|
||||
type === "boolean" ||
|
||||
Kotlin.isNumber(value) ||
|
||||
Kotlin.isType(value, Kotlin.kotlin.Comparable);
|
||||
};
|
||||
|
||||
Kotlin.isCharSequence = function (value) {
|
||||
return typeof value === "string" || Kotlin.isType(value, Kotlin.kotlin.CharSequence);
|
||||
};
|
||||
@@ -1,213 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@JsName("arrayIterator")
|
||||
internal fun arrayIterator(array: dynamic, type: String?) = when (type) {
|
||||
null -> {
|
||||
val arr: Array<dynamic> = array
|
||||
object : Iterator<dynamic> {
|
||||
var index = 0
|
||||
override fun hasNext() = index < arr.size
|
||||
override fun next() = if (index < arr.size) arr[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
}
|
||||
"BooleanArray" -> booleanArrayIterator(array)
|
||||
"ByteArray" -> byteArrayIterator(array)
|
||||
"ShortArray" -> shortArrayIterator(array)
|
||||
"CharArray" -> charArrayIterator(array)
|
||||
"IntArray" -> intArrayIterator(array)
|
||||
"LongArray" -> longArrayIterator(array)
|
||||
"FloatArray" -> floatArrayIterator(array)
|
||||
"DoubleArray" -> doubleArrayIterator(array)
|
||||
else -> throw IllegalStateException("Unsupported type argument for arrayIterator: $type")
|
||||
}
|
||||
|
||||
@JsName("booleanArrayIterator")
|
||||
internal fun booleanArrayIterator(array: BooleanArray) = object : BooleanIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextBoolean() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("byteArrayIterator")
|
||||
internal fun byteArrayIterator(array: ByteArray) = object : ByteIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextByte() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("shortArrayIterator")
|
||||
internal fun shortArrayIterator(array: ShortArray) = object : ShortIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextShort() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("charArrayIterator")
|
||||
internal fun charArrayIterator(array: CharArray) = object : CharIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextChar() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("intArrayIterator")
|
||||
internal fun intArrayIterator(array: IntArray) = object : IntIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextInt() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("floatArrayIterator")
|
||||
internal fun floatArrayIterator(array: FloatArray) = object : FloatIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextFloat() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("doubleArrayIterator")
|
||||
internal fun doubleArrayIterator(array: DoubleArray) = object : DoubleIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextDouble() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("longArrayIterator")
|
||||
internal fun longArrayIterator(array: LongArray) = object : LongIterator() {
|
||||
var index = 0
|
||||
override fun hasNext() = index < array.size
|
||||
override fun nextLong() = if (index < array.size) array[index++] else throw NoSuchElementException("$index")
|
||||
}
|
||||
|
||||
@JsName("PropertyMetadata")
|
||||
internal class PropertyMetadata(@JsName("callableName") val name: String)
|
||||
|
||||
@JsName("noWhenBranchMatched")
|
||||
internal fun noWhenBranchMatched(): Nothing = throw NoWhenBranchMatchedException()
|
||||
|
||||
@JsName("subSequence")
|
||||
internal fun subSequence(c: CharSequence, startIndex: Int, endIndex: Int): CharSequence {
|
||||
if (c is String) {
|
||||
return c.substring(startIndex, endIndex)
|
||||
} else {
|
||||
return c.asDynamic().`subSequence_vux9f0$`(startIndex, endIndex)
|
||||
}
|
||||
}
|
||||
|
||||
@JsName("captureStack")
|
||||
internal fun captureStack(baseClass: JsClass<in Throwable>, instance: Throwable) {
|
||||
if (js("Error").captureStackTrace) {
|
||||
js("Error").captureStackTrace(instance, instance::class.js);
|
||||
} else {
|
||||
instance.asDynamic().stack = js("new Error()").stack;
|
||||
}
|
||||
}
|
||||
|
||||
@JsName("newThrowable")
|
||||
internal fun newThrowable(message: String?, cause: Throwable?): Throwable {
|
||||
val throwable = js("new Error()")
|
||||
throwable.message = if (jsTypeOf(message) == "undefined") {
|
||||
if (cause != null) cause.toString() else null
|
||||
} else {
|
||||
message
|
||||
}
|
||||
throwable.cause = cause
|
||||
throwable.name = "Throwable"
|
||||
return throwable
|
||||
}
|
||||
|
||||
@JsName("BoxedChar")
|
||||
internal class BoxedChar(val c: Int) : Comparable<Int> {
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return other is BoxedChar && c == other.c
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return c
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return js("this.c").unsafeCast<Char>().toString()
|
||||
}
|
||||
|
||||
override fun compareTo(other: Int): Int {
|
||||
return js("this.c - other").unsafeCast<Int>()
|
||||
}
|
||||
|
||||
@JsName("valueOf")
|
||||
public fun valueOf(): Int {
|
||||
return c
|
||||
}
|
||||
}
|
||||
|
||||
@kotlin.internal.InlineOnly
|
||||
internal inline fun <T> concat(args: Array<T>): T {
|
||||
val typed = js("Array")(args.size)
|
||||
for (i in args.indices) {
|
||||
val arr = args[i]
|
||||
if (arr !is Array<*>) {
|
||||
typed[i] = js("[]").slice.call(arr)
|
||||
} else {
|
||||
typed[i] = arr
|
||||
}
|
||||
}
|
||||
return js("[]").concat.apply(js("[]"), typed);
|
||||
}
|
||||
|
||||
/** Concat regular Array's and TypedArray's into an Array.
|
||||
*/
|
||||
@PublishedApi
|
||||
@JsName("arrayConcat")
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
internal fun <T> arrayConcat(a: T, b: T): T {
|
||||
return concat(js("arguments"))
|
||||
}
|
||||
|
||||
/** Concat primitive arrays. Main use: prepare vararg arguments.
|
||||
* For compatibility with 1.1.0 the arguments may be a mixture of Array's and TypedArray's.
|
||||
*
|
||||
* If the first argument is TypedArray (Byte-, Short-, Char-, Int-, Float-, and DoubleArray) returns a TypedArray, otherwise an Array.
|
||||
* If the first argument has the $type$ property (Boolean-, Char-, and LongArray) copy its value to result.$type$.
|
||||
* If the first argument is a regular Array without the $type$ property default to arrayConcat.
|
||||
*/
|
||||
@PublishedApi
|
||||
@JsName("primitiveArrayConcat")
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
internal fun <T> primitiveArrayConcat(a: T, b: T): T {
|
||||
val args: Array<T> = js("arguments")
|
||||
if (a is Array<*> && a.asDynamic().`$type$` === undefined) {
|
||||
return concat(args)
|
||||
} else {
|
||||
var size = 0
|
||||
for (i in args.indices) {
|
||||
size += args[i].asDynamic().length as Int
|
||||
}
|
||||
val result = js("new a.constructor(size)")
|
||||
kotlin.copyArrayType(a, result)
|
||||
size = 0
|
||||
for (i in args.indices) {
|
||||
val arr = args[i].asDynamic()
|
||||
for (j in 0 until arr.length) {
|
||||
result[size++] = arr[j]
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
@JsName("booleanArrayOf")
|
||||
internal fun booleanArrayOf() = withType("BooleanArray", js("[].slice.call(arguments)"))
|
||||
|
||||
@JsName("charArrayOf") // The arguments have to be slice'd here because of Rhino (see KT-16974)
|
||||
internal fun charArrayOf() = withType("CharArray", js("new Uint16Array([].slice.call(arguments))"))
|
||||
|
||||
@JsName("longArrayOf")
|
||||
internal fun longArrayOf() = withType("LongArray", js("[].slice.call(arguments)"))
|
||||
|
||||
@JsName("withType")
|
||||
@kotlin.internal.InlineOnly
|
||||
internal inline fun withType(type: String, array: dynamic): dynamic {
|
||||
array.`$type$` = type
|
||||
return array
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.collections
|
||||
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
internal inline fun deleteProperty(obj: Any, property: Any) {
|
||||
js("delete obj[property]")
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.collections
|
||||
|
||||
@library("arrayToString")
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
internal fun arrayToString(array: Array<*>): String = definedExternally
|
||||
@@ -1,92 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.coroutines
|
||||
|
||||
import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
|
||||
|
||||
@SinceKotlin("1.3")
|
||||
@JsName("CoroutineImpl")
|
||||
internal abstract class CoroutineImpl(private val resultContinuation: Continuation<Any?>) : Continuation<Any?> {
|
||||
protected var state = 0
|
||||
protected var exceptionState = 0
|
||||
protected var result: Any? = null
|
||||
protected var exception: Throwable? = null
|
||||
protected var finallyPath: Array<Int>? = null
|
||||
|
||||
public override val context: CoroutineContext = resultContinuation.context
|
||||
|
||||
private var intercepted_: Continuation<Any?>? = null
|
||||
|
||||
public fun intercepted(): Continuation<Any?> =
|
||||
intercepted_
|
||||
?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)
|
||||
.also { intercepted_ = it }
|
||||
|
||||
override fun resumeWith(result: Result<Any?>) {
|
||||
var current = this
|
||||
var currentResult: Any? = result.getOrNull()
|
||||
var currentException: Throwable? = result.exceptionOrNull()
|
||||
|
||||
// This loop unrolls recursion in current.resumeWith(param) to make saner and shorter stack traces on resume
|
||||
while (true) {
|
||||
with(current) {
|
||||
val completion = resultContinuation
|
||||
|
||||
// Set result and exception fields in the current continuation
|
||||
if (currentException == null) {
|
||||
this.result = currentResult
|
||||
} else {
|
||||
state = exceptionState
|
||||
exception = currentException
|
||||
}
|
||||
|
||||
try {
|
||||
val outcome = doResume()
|
||||
if (outcome === COROUTINE_SUSPENDED) return
|
||||
currentResult = outcome
|
||||
currentException = null
|
||||
} catch (exception: dynamic) { // Catch all exceptions
|
||||
currentResult = null
|
||||
currentException = exception.unsafeCast<Throwable>()
|
||||
}
|
||||
|
||||
releaseIntercepted() // this state machine instance is terminating
|
||||
|
||||
if (completion is CoroutineImpl) {
|
||||
// unrolling recursion via loop
|
||||
current = completion
|
||||
} else {
|
||||
// top-level completion reached -- invoke and return
|
||||
currentException?.let {
|
||||
completion.resumeWithException(it)
|
||||
} ?: completion.resume(currentResult)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun releaseIntercepted() {
|
||||
val intercepted = intercepted_
|
||||
if (intercepted != null && intercepted !== this) {
|
||||
context[ContinuationInterceptor]!!.releaseInterceptedContinuation(intercepted)
|
||||
}
|
||||
this.intercepted_ = CompletedContinuation // just in case
|
||||
}
|
||||
|
||||
protected abstract fun doResume(): Any?
|
||||
}
|
||||
|
||||
internal object CompletedContinuation : Continuation<Any?> {
|
||||
override val context: CoroutineContext
|
||||
get() = error("This continuation is already complete")
|
||||
|
||||
override fun resumeWith(result: Result<Any?>) {
|
||||
error("This continuation is already complete")
|
||||
}
|
||||
|
||||
override fun toString(): String = "This continuation is already complete"
|
||||
}
|
||||
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.coroutines.intrinsics
|
||||
|
||||
import kotlin.coroutines.*
|
||||
import kotlin.internal.InlineOnly
|
||||
|
||||
/**
|
||||
* Starts unintercepted coroutine without receiver and with result type [T] and executes it until its first suspension.
|
||||
* Returns the result of the coroutine or throws its exception if it does not suspend or [COROUTINE_SUSPENDED] if it suspends.
|
||||
* In the later case, the [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* The coroutine is started directly in the invoker's thread without going through the [ContinuationInterceptor] that might
|
||||
* be present in the completion's [CoroutineContext]. It is invoker's responsibility to ensure that the proper invocation
|
||||
* context is established.
|
||||
*
|
||||
* This function is designed to be used from inside of [suspendCoroutineUninterceptedOrReturn] to resume the execution of suspended
|
||||
* coroutine using a reference to the suspending function.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@InlineOnly
|
||||
public actual inline fun <T> (suspend () -> T).startCoroutineUninterceptedOrReturn(
|
||||
completion: Continuation<T>
|
||||
): Any? = this.asDynamic()(completion, false)
|
||||
|
||||
/**
|
||||
* Starts unintercepted coroutine with receiver type [R] and result type [T] and executes it until its first suspension.
|
||||
* Returns the result of the coroutine or throws its exception if it does not suspend or [COROUTINE_SUSPENDED] if it suspends.
|
||||
* In the later case, the [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* The coroutine is started directly in the invoker's thread without going through the [ContinuationInterceptor] that might
|
||||
* be present in the completion's [CoroutineContext]. It is invoker's responsibility to ensure that the proper invocation
|
||||
* context is established.
|
||||
*
|
||||
* This function is designed to be used from inside of [suspendCoroutineUninterceptedOrReturn] to resume the execution of suspended
|
||||
* coroutine using a reference to the suspending function.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
@InlineOnly
|
||||
public actual inline fun <R, T> (suspend R.() -> T).startCoroutineUninterceptedOrReturn(
|
||||
receiver: R,
|
||||
completion: Continuation<T>
|
||||
): Any? = this.asDynamic()(receiver, completion, false)
|
||||
|
||||
|
||||
/**
|
||||
* Creates unintercepted coroutine without receiver and with result type [T].
|
||||
* This function creates a new, fresh instance of suspendable computation every time it is invoked.
|
||||
*
|
||||
* To start executing the created coroutine, invoke `resume(Unit)` on the returned [Continuation] instance.
|
||||
* The [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* This function returns unintercepted continuation.
|
||||
* Invocation of `resume(Unit)` starts coroutine immediately in the invoker's call stack without going through the
|
||||
* [ContinuationInterceptor] that might be present in the completion's [CoroutineContext].
|
||||
* It is invoker's responsibility to ensure that the proper invocation context is established.
|
||||
* Note that [completion] of this function may get invoked in an arbitrary context.
|
||||
*
|
||||
* [Continuation.intercepted] can be used to acquire the intercepted continuation.
|
||||
* Invocation of `resume(Unit)` on intercepted continuation guarantees that execution of
|
||||
* both the coroutine and [completion] happens in the invocation context established by
|
||||
* [ContinuationInterceptor].
|
||||
*
|
||||
* Repeated invocation of any resume function on the resulting continuation corrupts the
|
||||
* state machine of the coroutine and may result in arbitrary behaviour or exception.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <T> (suspend () -> T).createCoroutineUnintercepted(
|
||||
completion: Continuation<T>
|
||||
): Continuation<Unit> =
|
||||
// Kotlin/JS suspend lambdas have an extra parameter `suspended`
|
||||
if (this.asDynamic().length == 2) {
|
||||
// When `suspended` is true the continuation is created, but not executed
|
||||
this.asDynamic()(completion, true)
|
||||
} else {
|
||||
createCoroutineFromSuspendFunction(completion) {
|
||||
this.asDynamic()(completion)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates unintercepted coroutine with receiver type [R] and result type [T].
|
||||
* This function creates a new, fresh instance of suspendable computation every time it is invoked.
|
||||
*
|
||||
* To start executing the created coroutine, invoke `resume(Unit)` on the returned [Continuation] instance.
|
||||
* The [completion] continuation is invoked when coroutine completes with result or exception.
|
||||
*
|
||||
* This function returns unintercepted continuation.
|
||||
* Invocation of `resume(Unit)` starts coroutine immediately in the invoker's call stack without going through the
|
||||
* [ContinuationInterceptor] that might be present in the completion's [CoroutineContext].
|
||||
* It is invoker's responsibility to ensure that the proper invocation context is established.
|
||||
* Note that [completion] of this function may get invoked in an arbitrary context.
|
||||
*
|
||||
* [Continuation.intercepted] can be used to acquire the intercepted continuation.
|
||||
* Invocation of `resume(Unit)` on intercepted continuation guarantees that execution of
|
||||
* both the coroutine and [completion] happens in the invocation context established by
|
||||
* [ContinuationInterceptor].
|
||||
*
|
||||
* Repeated invocation of any resume function on the resulting continuation corrupts the
|
||||
* state machine of the coroutine and may result in arbitrary behaviour or exception.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <R, T> (suspend R.() -> T).createCoroutineUnintercepted(
|
||||
receiver: R,
|
||||
completion: Continuation<T>
|
||||
): Continuation<Unit> =
|
||||
// Kotlin/JS suspend lambdas have an extra parameter `suspended`
|
||||
if (this.asDynamic().length == 3) {
|
||||
// When `suspended` is true the continuation is created, but not executed
|
||||
this.asDynamic()(receiver, completion, true)
|
||||
} else {
|
||||
createCoroutineFromSuspendFunction(completion) {
|
||||
this.asDynamic()(receiver, completion)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercepts this continuation with [ContinuationInterceptor].
|
||||
*
|
||||
* This function shall be used on the immediate result of [createCoroutineUnintercepted] or [suspendCoroutineUninterceptedOrReturn],
|
||||
* in which case it checks for [ContinuationInterceptor] in the continuation's [context][Continuation.context],
|
||||
* invokes [ContinuationInterceptor.interceptContinuation], caches and returns result.
|
||||
*
|
||||
* If this function is invoked on other [Continuation] instances it returns `this` continuation unchanged.
|
||||
*/
|
||||
@SinceKotlin("1.3")
|
||||
public actual fun <T> Continuation<T>.intercepted(): Continuation<T> =
|
||||
(this as? CoroutineImpl)?.intercepted() ?: this
|
||||
|
||||
|
||||
private inline fun <T> createCoroutineFromSuspendFunction(
|
||||
completion: Continuation<T>,
|
||||
crossinline block: () -> Any?
|
||||
): Continuation<Unit> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return object : CoroutineImpl(completion as Continuation<Any?>) {
|
||||
override fun doResume(): Any? {
|
||||
exception?.let { throw it }
|
||||
return block()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
// Mirrors signature from JS IR BE
|
||||
// Used for js.translator/testData/box/number/mulInt32.kt
|
||||
@library
|
||||
@JsName("imulEmulated")
|
||||
internal fun imul(x: Int, y: Int): Int = definedExternally
|
||||
@@ -1,13 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package kotlin.js
|
||||
|
||||
/**
|
||||
* Function corresponding to JavaScript's `typeof` operator
|
||||
*/
|
||||
@kotlin.internal.InlineOnly
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
public inline fun jsTypeOf(a: Any?): String = js("typeof a")
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
@file:Suppress("UNUSED_PARAMETER", "NOTHING_TO_INLINE")
|
||||
|
||||
package kotlin
|
||||
|
||||
/**
|
||||
* Returns an empty array of the specified type [T].
|
||||
*/
|
||||
public inline fun <T> emptyArray(): Array<T> = js("[]")
|
||||
|
||||
@library
|
||||
public fun <T> arrayOf(vararg elements: T): Array<T> = definedExternally
|
||||
|
||||
@library
|
||||
public fun doubleArrayOf(vararg elements: Double): DoubleArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun floatArrayOf(vararg elements: Float): FloatArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun longArrayOf(vararg elements: Long): LongArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun intArrayOf(vararg elements: Int): IntArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun charArrayOf(vararg elements: Char): CharArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun shortArrayOf(vararg elements: Short): ShortArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun byteArrayOf(vararg elements: Byte): ByteArray = definedExternally
|
||||
|
||||
@library
|
||||
public fun booleanArrayOf(vararg elements: Boolean): BooleanArray = definedExternally
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*/
|
||||
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*
|
||||
* The [mode] parameter is ignored. */
|
||||
public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer].
|
||||
*
|
||||
* The [lock] parameter is ignored.
|
||||
*/
|
||||
public actual fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> = UnsafeLazyImpl(initializer)
|
||||
|
||||
|
||||
internal fun fillFrom(src: dynamic, dst: dynamic): dynamic {
|
||||
val srcLen: Int = src.length
|
||||
val dstLen: Int = dst.length
|
||||
var index: Int = 0
|
||||
while (index < srcLen && index < dstLen) dst[index] = src[index++]
|
||||
return dst
|
||||
}
|
||||
|
||||
|
||||
internal fun arrayCopyResize(source: dynamic, newSize: Int, defaultValue: Any?): dynamic {
|
||||
val result = source.slice(0, newSize)
|
||||
copyArrayType(source, result)
|
||||
var index: Int = source.length
|
||||
if (newSize > index) {
|
||||
result.length = newSize
|
||||
while (index < newSize) result[index++] = defaultValue
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun <T> arrayPlusCollection(array: dynamic, collection: Collection<T>): dynamic {
|
||||
val result = array.slice()
|
||||
result.length += collection.size
|
||||
copyArrayType(array, result)
|
||||
var index: Int = array.length
|
||||
for (element in collection) result[index++] = element
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun <T> fillFromCollection(dst: dynamic, startIndex: Int, collection: Collection<T>): dynamic {
|
||||
var index = startIndex
|
||||
for (element in collection) dst[index++] = element
|
||||
return dst
|
||||
}
|
||||
|
||||
internal inline fun copyArrayType(from: dynamic, to: dynamic) {
|
||||
if (from.`$type$` !== undefined) {
|
||||
to.`$type$` = from.`$type$`
|
||||
}
|
||||
}
|
||||
|
||||
internal inline fun jsIsType(obj: dynamic, jsClass: dynamic) = js("Kotlin").isType(obj, jsClass)
|
||||
@@ -73,7 +73,7 @@ internal object PrimitiveClasses {
|
||||
fun functionClass(arity: Int): KClassImpl<Any> {
|
||||
return functionClasses.get(arity) ?: run {
|
||||
val result = PrimitiveKClassImpl(js("Function").unsafeCast<JsClass<Any>>(), "Function$arity",
|
||||
{ jsTypeOf(it) === "function" && it.asDynamic().length == arity })
|
||||
{ jsTypeOf(it) === "function" && it.asDynamic().length === arity })
|
||||
functionClasses.asDynamic()[arity] = result
|
||||
result
|
||||
}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define('kotlin', ['exports'], factory);
|
||||
}
|
||||
else if (typeof exports === 'object') {
|
||||
factory(module.exports);
|
||||
}
|
||||
else {
|
||||
root.kotlin = {};
|
||||
factory(root.kotlin);
|
||||
}
|
||||
}(this, function (Kotlin) {
|
||||
var _ = Kotlin;
|
||||
|
||||
insertContent();
|
||||
}));
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package test.js
|
||||
|
||||
import kotlin.test.*
|
||||
|
||||
class BuiltinCompanionJsTest {
|
||||
|
||||
@Test fun longMinMaxValues() {
|
||||
assertEquals(js("Kotlin.Long.MIN_VALUE"), Long.MIN_VALUE)
|
||||
assertEquals(js("Kotlin.Long.MAX_VALUE"), Long.MAX_VALUE)
|
||||
}
|
||||
|
||||
@Test fun doubleMinMaxValues() {
|
||||
assertEquals(js("Number.MIN_VALUE"), Double.MIN_VALUE)
|
||||
assertEquals(js("Number.MAX_VALUE"), Double.MAX_VALUE)
|
||||
assertEquals(js("Number.POSITIVE_INFINITY"), Double.POSITIVE_INFINITY)
|
||||
assertEquals(js("Number.NEGATIVE_INFINITY"), Double.NEGATIVE_INFINITY)
|
||||
}
|
||||
|
||||
@Test fun floatMinMaxValues() {
|
||||
assertEquals(js("Number.MIN_VALUE"), Float.MIN_VALUE)
|
||||
assertEquals(js("Number.MAX_VALUE"), Float.MAX_VALUE)
|
||||
assertEquals(js("Number.POSITIVE_INFINITY"), Float.POSITIVE_INFINITY)
|
||||
assertEquals(js("Number.NEGATIVE_INFINITY"), Float.NEGATIVE_INFINITY)
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Kotlin Standard Library Test Suite</title>
|
||||
|
||||
<!-- paths are setup for local file run -->
|
||||
<!-- run installMocha gradle task to fetch mocha -->
|
||||
<link href="../build/node_modules/mocha/mocha.css" rel="stylesheet"/>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mocha"></div>
|
||||
|
||||
<script src="../build/node_modules/mocha/mocha.js"></script>
|
||||
|
||||
<!--enables globals (describe, it)-->
|
||||
<script>mocha.setup('bdd');</script>
|
||||
|
||||
<script src="../build/classes/kotlin.js"></script>
|
||||
<script src="../../../kotlin.test/js/build/classes/main/kotlin-test.js"></script>
|
||||
<script src="../build/classes/kotlin/test/kotlin-stdlib-js_test.js"></script>
|
||||
<script src="../../../kotlin.test/js/build/classes/kotlin/test/kotlin-test-js_test.js"></script>
|
||||
|
||||
<script>
|
||||
mocha.checkLeaks();
|
||||
mocha.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user