in rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/impl/RdMap.kt [83:139]
override fun init(lifetime: Lifetime, proto: IProtocol, ctx: SerializationCtx) {
super.init(lifetime, proto, ctx)
if (!optimizeNested) {
change.advise(lifetime) {
if (isLocalChange) {
val definitions = tryGetBindDefinitions(lifetime) ?: return@advise
if (it !is IViewableMap.Event.Add)
definitions[it.key]?.terminate()
if (it is IViewableMap.Event.Remove)
definitions.remove(it.key)
if (it !is IViewableMap.Event.Remove) {
val value = it.newValueOpt
value.identifyPolymorphic(proto.identity, proto.identity.next(rdid))
val definition = tryPreBindValue(lifetime, it.key, value, false)
definitions.put(it.key, definition)?.terminate()
}
}
}
}
localChange { advise(lifetime) lambda@{
if (!isLocalChange) return@lambda
proto.wire.send(rdid) { buffer ->
val versionedFlag = (if (master) 1 else 0) shl versionedFlagShift
val op = when (it) {
is IViewableMap.Event.Add -> Op.Add
is IViewableMap.Event.Update -> Op.Update
is IViewableMap.Event.Remove -> Op.Remove
}
buffer.writeInt(versionedFlag or op.ordinal)
val version = if (master) ++nextVersion else 0L
if (master) {
Sync.lock(pendingForAck) {
pendingForAck.put(it.key, version)
}
buffer.writeLong(version)
}
keySzr.write(ctx, buffer, it.key)
it.newValueOpt?.let { valSzr.write(ctx, buffer, it) }
logSend.trace { logmsg(op, version, it.key, it.newValueOpt) }
}
if (!optimizeNested)
it.newValueOpt.bindPolymorphic()
}}
}