All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jsMain.kotlinx.atomicfu.AtomicFU.kt Maven / Gradle / Ivy

/*
 * Copyright 2017-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

@file:Suppress("NOTHING_TO_INLINE", "RedundantVisibilityModifier", "CanBePrimaryConstructorProperty")

package kotlinx.atomicfu

@JsName("atomic\$ref\$")
public actual fun  atomic(initial: T): AtomicRef = AtomicRef(initial)

@JsName("atomic\$int\$")
public actual fun atomic(initial: Int): AtomicInt = AtomicInt(initial)

@JsName("atomic\$long\$")
public actual fun atomic(initial: Long): AtomicLong = AtomicLong(initial)

@JsName("atomic\$boolean\$")
public actual fun atomic(initial: Boolean): AtomicBoolean = AtomicBoolean(initial)

// ==================================== AtomicRef ====================================

public actual class AtomicRef internal constructor(value: T) {
    @JsName("kotlinx\$atomicfu\$value")
    public actual var value: T = value

    public actual inline fun lazySet(value: T) { this.value = value }

    @JsName("compareAndSet\$atomicfu")
    public actual fun compareAndSet(expect: T, update: T): Boolean {
        if (value !== expect) return false
        value = update
        return true
    }

    @JsName("getAndSet\$atomicfu")
    public actual fun getAndSet(value: T): T {
        val oldValue = this.value
        this.value = value
        return oldValue
    }

    override fun toString(): String = value.toString()
}

// ==================================== AtomicBoolean ====================================

public actual class AtomicBoolean internal constructor(value: Boolean) {
    @JsName("kotlinx\$atomicfu\$value")
    public actual var value: Boolean = value

    public actual inline fun lazySet(value: Boolean) {
        this.value = value
    }

    @JsName("compareAndSet\$atomicfu")
    public actual fun compareAndSet(expect: Boolean, update: Boolean): Boolean {
        if (value != expect) return false
        value = update
        return true
    }

    @JsName("getAndSet\$atomicfu")
    public actual fun getAndSet(value: Boolean): Boolean {
        val oldValue = this.value
        this.value = value
        return oldValue
    }

    override fun toString(): String = value.toString()
}

// ==================================== AtomicInt ====================================

public actual class AtomicInt internal constructor(value: Int) {
    @JsName("kotlinx\$atomicfu\$value")
    public actual var value: Int = value

    public actual inline fun lazySet(value: Int) { this.value = value }

    @JsName("compareAndSet\$atomicfu")
    public actual fun compareAndSet(expect: Int, update: Int): Boolean {
        if (value != expect) return false
        value = update
        return true
    }

    @JsName("getAndSet\$atomicfu")
    public actual fun getAndSet(value: Int): Int {
        val oldValue = this.value
        this.value = value
        return oldValue
    }

    @JsName("getAndIncrement\$atomicfu")
    public actual fun getAndIncrement(): Int = value++

    @JsName("getAndDecrement\$atomicfu")
    public actual fun getAndDecrement(): Int = value--

    @JsName("getAndAdd\$atomicfu")
    public actual fun getAndAdd(delta: Int): Int {
        val oldValue = value
        value += delta
        return oldValue
    }

    @JsName("addAndGet\$atomicfu")
    public actual fun addAndGet(delta: Int): Int {
        value += delta
        return value
    }

    @JsName("incrementAndGet\$atomicfu")
    public actual fun incrementAndGet(): Int = ++value

    @JsName("decrementAndGet\$atomicfu")
    public actual fun decrementAndGet(): Int = --value

    public actual inline operator fun plusAssign(delta: Int) { getAndAdd(delta) }

    public actual inline operator fun minusAssign(delta: Int) { getAndAdd(-delta) }

    override fun toString(): String = value.toString()
}

// ==================================== AtomicLong ====================================

public actual class AtomicLong internal constructor(value: Long) {
    @JsName("kotlinx\$atomicfu\$value")
    public actual var value: Long = value

    public actual inline fun lazySet(value: Long) { this.value = value }

    @JsName("compareAndSet\$atomicfu")
    public actual fun compareAndSet(expect: Long, update: Long): Boolean {
        if (value != expect) return false
        value = update
        return true
    }

    @JsName("getAndSet\$atomicfu")
    public actual fun getAndSet(value: Long): Long {
        val oldValue = this.value
        this.value = value
        return oldValue
    }

    @JsName("getAndIncrement\$atomicfu\$long")
    public actual fun getAndIncrement(): Long = value++

    @JsName("getAndDecrement\$atomicfu\$long")
    public actual fun getAndDecrement(): Long = value--

    @JsName("getAndAdd\$atomicfu\$long")
    public actual fun getAndAdd(delta: Long): Long {
        val oldValue = value
        value += delta
        return oldValue
    }

    @JsName("addAndGet\$atomicfu\$long")
    public actual fun addAndGet(delta: Long): Long {
        value += delta
        return value
    }

    @JsName("incrementAndGet\$atomicfu\$long")
    public actual fun incrementAndGet(): Long = ++value

    @JsName("decrementAndGet\$atomicfu\$long")
    public actual fun decrementAndGet(): Long = --value

    public actual inline operator fun plusAssign(delta: Long) { getAndAdd(delta) }

    public actual inline operator fun minusAssign(delta: Long) { getAndAdd(-delta) }

    override fun toString(): String = value.toString()
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy