- // TODO: consider switching to VarHandles for Java 9+
- protected final Object codecMember(final AtomicReferenceFieldUpdater<CodecDataObject<?>, Object> updater,
- final int offset) {
- final Object cached = updater.get(this);
- return cached != null ? unmaskNull(cached) : loadMember(updater, offset);
+ protected final Object codecMember(final VarHandle handle, final CodecContextSupplier supplier) {
+ final Object cached = handle.getAcquire(this);
+ return cached != null ? unmaskNull(cached) : loadMember(handle, supplier.get());
+ }
+
+ protected final @NonNull Object codecMemberOrEmpty(final @Nullable Object value,
+ final @NonNull Class<? extends DataObject> bindingClass) {
+ return value != null ? value : emptyObject(bindingClass);
+ }
+
+ private @NonNull Object emptyObject(final @NonNull Class<? extends DataObject> bindingClass) {
+ final var childContext = context.getStreamChild(bindingClass);
+ if (childContext instanceof StructuralContainerCodecContext<?> structural) {
+ return structural.emptyObject();
+ }
+ throw new VerifyException("Unexpected context " + childContext);
+ }
+
+ protected final @NonNull Object codecKey(final VarHandle handle) {
+ final Object cached = handle.getAcquire(this);
+ return cached != null ? cached : loadKey(handle);