docs
This commit is contained in:
parent
1e34b7dfce
commit
ebabcdf731
@ -10,11 +10,28 @@ import java.util.function.Predicate
|
|||||||
import kotlin.NoSuchElementException
|
import kotlin.NoSuchElementException
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents value which can be encoded onto or decoded from stream.
|
||||||
|
*
|
||||||
|
* Also provides [copy] and [compare] methods
|
||||||
|
*/
|
||||||
interface IStreamCodec<V> {
|
interface IStreamCodec<V> {
|
||||||
fun read(stream: DataInputStream): V
|
fun read(stream: DataInputStream): V
|
||||||
fun write(stream: DataOutputStream, value: V)
|
fun write(stream: DataOutputStream, value: V)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* if value is immutable, return it right away
|
||||||
|
*/
|
||||||
fun copy(value: V): V
|
fun copy(value: V): V
|
||||||
fun compare(a: V, b: V): Boolean
|
|
||||||
|
/**
|
||||||
|
* Optional equality check override. Utilized to determine whenever e.g. network value is different from new value
|
||||||
|
*
|
||||||
|
* By default uses [Any.equals]
|
||||||
|
*/
|
||||||
|
fun compare(a: V, b: V): Boolean {
|
||||||
|
return a == b
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StreamCodec<V>(
|
class StreamCodec<V>(
|
||||||
|
@ -94,6 +94,24 @@ enum class MapAction {
|
|||||||
CLEAR, ADD, REMOVE
|
CLEAR, ADD, REMOVE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Universal one-to-many value synchronizer
|
||||||
|
*
|
||||||
|
* This class represent collection of synchronizable values (similar to entitydata or menu's dataslots)
|
||||||
|
*
|
||||||
|
* Advantages of this class are:
|
||||||
|
* * It can be freely pooled. You can call [collectNetworkPayload] and [FieldSynchronizer.Endpoint.collectNetworkPayload] as much as you like,
|
||||||
|
* because they use dirty lists to track which fields need networking. **Warning**: If you attach one or more "observed" values (more on them below),
|
||||||
|
* each call to above methods will cause scan on observed fields.
|
||||||
|
* * It is universal. No, seriously, you can use it anywhere, all it needs is you encode [FastByteArrayOutputStream], send it over your
|
||||||
|
* networking channel, and create [InputStream] to feed to [FieldSynchronizer.Endpoint]
|
||||||
|
* * Its capabilities at networking are only limited by codecs you provide, see [FieldSynchronizer.Field], [IStreamCodec]
|
||||||
|
* * Provides not only single values, but also smart [FieldSynchronizer.Map] map synchronization
|
||||||
|
* * Has network version "conflict" resolver. If source FieldSynchronizer and target FieldSynchronizer have different set of fields, they can figure out how to synchronize
|
||||||
|
* only known fields. **Keep in mind this only works if you manually specify names on ALL created fields**
|
||||||
|
* * Directly bytestream embeddable. [FieldSynchronizer.Endpoint] always knows how much bytes to read from incoming stream, you can directly embed it into your data flow
|
||||||
|
* on network channel.
|
||||||
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCallback: Boolean) {
|
class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCallback: Boolean) {
|
||||||
constructor() : this(Runnable {}, false)
|
constructor() : this(Runnable {}, false)
|
||||||
|
Loading…
Reference in New Issue
Block a user