Skip to content
Snippets Groups Projects
Select Git revision
  • f4fd1c3cea46bdfa40c4c70686caa6abbe44a083
  • master default protected
  • greenkeeper/webpack-4.10.1
  • greenkeeper/webpack-4.10.0
  • greenkeeper/webpack-4.9.2
  • greenkeeper/promise-polyfill-8.0.0
  • greenkeeper/webpack-4.9.1
  • greenkeeper/webpack-4.9.0
  • greenkeeper/webpack-manifest-plugin-2.0.3
  • greenkeeper/update-to-node-10
  • gh-pages
  • greenkeeper/webpack-4.8.3
  • greenkeeper/webpack-4.8.2
  • greenkeeper/webpack-4.7.0
  • greenkeeper/webpack-manifest-plugin-2.0.2
  • greenkeeper/webpack-manifest-plugin-2.0.1
  • greenkeeper/style-loader-0.21.0
  • greenkeeper/webpack-4.6.0
  • greenkeeper/sass-loader-7.0.1
  • greenkeeper/sass-loader-7.0.0
  • greenkeeper/webpack-manifest-plugin-2.0.0
  • 2.7.3
  • 2.7.2
  • 2.7.1
  • 2.7.0
  • 2.6.6
  • 2.6.5
  • 2.6.4
  • 2.6.3
  • 2.6.2
  • 2.6.1
  • 2.6.0
  • 2.5.5
  • 2.5.4
  • 2.5.3
  • 2.5.2
  • 2.5.1
  • 2.5.0
  • 2.4.0
  • 2.3.0
  • 2.2.6
41 results

.eslintrc

Blame
  • Flag.kt 2.42 KiB
    package de.kuschku.libquassel.util
    
    interface Flag<T> where T : Enum<T>, T : Flag<T> {
      val bit: Int
      fun toByte() = bit.toByte()
      fun toChar() = bit.toChar()
      fun toDouble() = bit.toDouble()
      fun toFloat() = bit.toFloat()
      fun toInt() = bit
      fun toLong() = bit.toLong()
      fun toShort() = bit.toShort()
    }
    
    data class Flags<E>(
      val value: Int,
      val values: Array<E>? = null
    ) : Number(), Comparable<Int> where E : Enum<E>, E : Flag<E> {
      override fun compareTo(other: Int) = value.compareTo(other)
      override fun toByte() = value.toByte()
      override fun toChar() = value.toChar()
      override fun toDouble() = value.toDouble()
      override fun toFloat() = value.toFloat()
      override fun toInt() = value
      override fun toLong() = value.toLong()
      override fun toShort() = value.toShort()
    
      override fun equals(other: Any?) = when (other) {
        is Flags<*> -> other.value == value
        is Flag<*>  -> other.bit == value
        else        -> other === this
      }
    
      override fun hashCode(): Int {
        return value
      }
    
      fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet()
    
      fun empty() = value == 0
      fun nonEmpty() = !empty()
    
      override fun toString() = if (values != null) {
        enabledValues().joinToString("|", "[", "]")
      } else {
        value.toString(16)
      }
    
      companion object {
        inline fun <reified T> of(int: Int): Flags<T> where T : Flag<T>, T : Enum<T>
          = Flags(int, enumValues())
    
        inline fun <reified T> of(vararg flags: Flag<T>): Flags<T> where T : Flag<T>, T : Enum<T>
          = Flags(flags.map(Flag<T>::bit).distinct().sum(), enumValues())
      }
    
      interface Factory<E> where E : Flag<E>, E : Enum<E> {
        val NONE: Flags<E>
        fun of(bit: Int): Flags<E>
        fun of(vararg flags: E): Flags<E>
      }
    }
    
    infix fun <T> Flags<T>.hasFlag(which: T): Boolean where T : Enum<T>, T : Flag<T> {
      // an Undefined flag is a special case.
      if (value == 0 || (value > 0 && which.bit == 0)) return false
    
      return value and which.bit == which.bit
    }
    
    infix fun <T> Flags<T>.or(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags(
      value or other.bit
    )
    
    operator infix fun <T> Flags<T>.plus(
      other: Flags<T>): Flags<T>  where T : Enum<T>, T : Flag<T> = Flags(value or other.value)
    
    operator infix fun <T> Flags<T>.plus(
      other: Flag<T>): Flags<T>  where T : Enum<T>, T : Flag<T> = Flags(value or other.bit)
    
    infix fun <T> Flags<T>.unset(which: T): Flags<T>  where T : Enum<T>, T : Flag<T> = Flags(
      value xor which.bit
    )