From 8875a94dc6c3a525d507f80aae9bf060b36adb2d Mon Sep 17 00:00:00 2001 From: leventov Date: Tue, 27 Dec 2016 16:03:48 +0700 Subject: [PATCH] Copy VanillaGlobalMutableState29425Native and ReplicatedGlobalMutableState29425Native into source tree to practically improve user experience in OSGi/container/module environments until Chronicle Values learn how to generate classes in compile time --- pom.xml | 2 + .../VanillaGlobalMutableState$$Native.java | 217 ++++++++++++ .../ReplicatedGlobalMutableState$$Native.java | 318 ++++++++++++++++++ 3 files changed, 537 insertions(+) create mode 100644 src/main/java/net/openhft/chronicle/hash/VanillaGlobalMutableState$$Native.java create mode 100644 src/main/java/net/openhft/chronicle/map/ReplicatedGlobalMutableState$$Native.java diff --git a/pom.xml b/pom.xml index 59cee75a5..c3312bc01 100755 --- a/pom.xml +++ b/pom.xml @@ -271,10 +271,12 @@ net/openhft/chronicle/hash/ChronicleHashBuilderPrivateAPI.java net/openhft/chronicle/hash/VanillaGlobalMutableState.java net/openhft/chronicle/hash/ReplicatedHashSegmentContext.java + net/openhft/chronicle/hash/VanillaGlobalMutableState$$Native.java net/openhft/chronicle/map/MapDiagnostics.java net/openhft/chronicle/map/VanillaChronicleMap.java net/openhft/chronicle/map/Replica.java net/openhft/chronicle/map/ReplicatedChronicleMap.java + net/openhft/chronicle/map/ReplicatedGlobalMutableState$$Native.java net/openhft/chronicle/set/DummyValueData.java **/Compiled*.java diff --git a/src/main/java/net/openhft/chronicle/hash/VanillaGlobalMutableState$$Native.java b/src/main/java/net/openhft/chronicle/hash/VanillaGlobalMutableState$$Native.java new file mode 100644 index 000000000..ebd0c52df --- /dev/null +++ b/src/main/java/net/openhft/chronicle/hash/VanillaGlobalMutableState$$Native.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2016 higherfrequencytrading.com + * Copyright (C) 2016 Roman Leventov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package net.openhft.chronicle.hash; + +import java.lang.IllegalArgumentException; +import java.lang.IllegalStateException; +import java.lang.Object; +import java.lang.Override; +import java.lang.String; +import java.lang.StringBuilder; +import net.openhft.chronicle.bytes.Byteable; +import net.openhft.chronicle.bytes.BytesIn; +import net.openhft.chronicle.bytes.BytesMarshallable; +import net.openhft.chronicle.bytes.BytesOut; +import net.openhft.chronicle.bytes.BytesStore; +import net.openhft.chronicle.values.Copyable; + +/** + * This class is a dumped output of {@link VanillaGlobalMutableState#main(String[])}. Chronicle + * Values still have problems with class loading in OSGi/container/module environments. Dumping the + * class is a practical workaround for Chronicle Map users who don't need Value-interface keys or + * values, until Chronicle Values learn how to generate classes in compile time. + * + * @deprecated don't use this class directly, it might be removed in the future versions. Use + * {@link net.openhft.chronicle.values.Values#nativeClassFor(Class) + * Values.nativeClassFor(VanillaGlobalMutableState.class)} + */ +@Deprecated +public class VanillaGlobalMutableState$$Native implements VanillaGlobalMutableState, Copyable, BytesMarshallable, Byteable { + private BytesStore bs; + + private long offset; + + @Override + public int getAllocatedExtraTierBulks() { + return (bs.readInt(offset + 0)) & ((1 << 24) - 1); + } + + @Override + public void setAllocatedExtraTierBulks(int _allocatedExtraTierBulks) { + if (_allocatedExtraTierBulks < 0 || _allocatedExtraTierBulks > 16777215) { + throw new IllegalArgumentException("_allocatedExtraTierBulks should be in [0, 16777215] range, " + _allocatedExtraTierBulks + " is given"); + } + bs.writeInt(offset + 0, ((bs.readInt(offset + 0)) & 0xFF000000) | (_allocatedExtraTierBulks)); + } + + @Override + public long getFirstFreeTierIndex() { + return (bs.readLong(offset + 3)) & ((1L << 40) - 1); + } + + @Override + public void setFirstFreeTierIndex(long _firstFreeTierIndex) { + if (_firstFreeTierIndex < 0 || _firstFreeTierIndex > 1099511627775L) { + throw new IllegalArgumentException("_firstFreeTierIndex should be in [0, 1099511627775] range, " + _firstFreeTierIndex + " is given"); + } + bs.writeLong(offset + 3, ((bs.readLong(offset + 3)) & 0xFFFFFF0000000000L) | (_firstFreeTierIndex)); + } + + @Override + public long getExtraTiersInUse() { + return (bs.readLong(offset + 8)) & ((1L << 40) - 1); + } + + @Override + public void setExtraTiersInUse(long _extraTiersInUse) { + if (_extraTiersInUse < 0 || _extraTiersInUse > 1099511627775L) { + throw new IllegalArgumentException("_extraTiersInUse should be in [0, 1099511627775] range, " + _extraTiersInUse + " is given"); + } + bs.writeLong(offset + 8, ((bs.readLong(offset + 8)) & 0xFFFFFF0000000000L) | (_extraTiersInUse)); + } + + @Override + public long getSegmentHeadersOffset() { + return (bs.readInt(offset + 13)) & 0xFFFFFFFFL; + } + + @Override + public void setSegmentHeadersOffset(long _segmentHeadersOffset) { + if (_segmentHeadersOffset < 0 || _segmentHeadersOffset > 4294967295L) { + throw new IllegalArgumentException("_segmentHeadersOffset should be in [0, 4294967295] range, " + _segmentHeadersOffset + " is given"); + } + bs.writeInt(offset + 13, (int) (_segmentHeadersOffset)); + } + + @Override + public long getDataStoreSize() { + return bs.readLong(offset + 17); + } + + @Override + public void setDataStoreSize(long _dataStoreSize) { + if (_dataStoreSize < 0) { + throw new IllegalArgumentException("_dataStoreSize should be in [0, 9223372036854775807] range, " + _dataStoreSize + " is given"); + } + bs.writeLong(offset + 17, _dataStoreSize); + } + + @Override + public long addDataStoreSize(long addition) { + long oldDataStoreSize = bs.readLong(offset + 17); + long newDataStoreSize = oldDataStoreSize + addition; + if (newDataStoreSize < 0) { + throw new IllegalStateException("bs.readLong(offset + 17) should be in [0, 9223372036854775807] range, the value was " + oldDataStoreSize + ", + " + addition + " = " + newDataStoreSize + " out of the range"); + } + bs.writeLong(offset + 17, newDataStoreSize); + return newDataStoreSize; + } + + @Override + public void copyFrom(VanillaGlobalMutableState from) { + setAllocatedExtraTierBulks(from.getAllocatedExtraTierBulks()); + setFirstFreeTierIndex(from.getFirstFreeTierIndex()); + setExtraTiersInUse(from.getExtraTiersInUse()); + setSegmentHeadersOffset(from.getSegmentHeadersOffset()); + setDataStoreSize(from.getDataStoreSize()); + } + + @Override + public void writeMarshallable(BytesOut bytes) { + bytes.writeInt((bs.readInt(offset + 0)) & ((1 << 24) - 1)); + bytes.writeLong((bs.readLong(offset + 3)) & ((1L << 40) - 1)); + bytes.writeLong((bs.readLong(offset + 8)) & ((1L << 40) - 1)); + bytes.writeLong((bs.readInt(offset + 13)) & 0xFFFFFFFFL); + bytes.writeLong(bs.readLong(offset + 17)); + } + + @Override + public void readMarshallable(BytesIn bytes) { + bs.writeInt(offset + 0, ((bs.readInt(offset + 0)) & 0xFF000000) | (bytes.readInt())); + bs.writeLong(offset + 3, ((bs.readLong(offset + 3)) & 0xFFFFFF0000000000L) | (bytes.readLong())); + bs.writeLong(offset + 8, ((bs.readLong(offset + 8)) & 0xFFFFFF0000000000L) | (bytes.readLong())); + bs.writeInt(offset + 13, (int) (bytes.readLong())); + bs.writeLong(offset + 17, bytes.readLong()); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof VanillaGlobalMutableState)) return false; + VanillaGlobalMutableState other = (VanillaGlobalMutableState) obj; + if (getAllocatedExtraTierBulks() != other.getAllocatedExtraTierBulks()) return false; + if (getFirstFreeTierIndex() != other.getFirstFreeTierIndex()) return false; + if (getExtraTiersInUse() != other.getExtraTiersInUse()) return false; + if (getSegmentHeadersOffset() != other.getSegmentHeadersOffset()) return false; + if (getDataStoreSize() != other.getDataStoreSize()) return false; + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + hashCode *= 1000003; + hashCode ^= java.lang.Integer.hashCode(getAllocatedExtraTierBulks()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getFirstFreeTierIndex()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getExtraTiersInUse()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getSegmentHeadersOffset()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getDataStoreSize()); + return hashCode; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("VanillaGlobalMutableState"); + sb.append(", allocatedExtraTierBulks=").append(getAllocatedExtraTierBulks()); + sb.append(", firstFreeTierIndex=").append(getFirstFreeTierIndex()); + sb.append(", extraTiersInUse=").append(getExtraTiersInUse()); + sb.append(", segmentHeadersOffset=").append(getSegmentHeadersOffset()); + sb.append(", dataStoreSize=").append(getDataStoreSize()); + sb.setCharAt(25, '{'); + sb.append(' ').append('}'); + return sb.toString(); + } + + @Override + public void bytesStore(BytesStore bytesStore, long offset, long length) { + if (length != maxSize()) { + throw new IllegalArgumentException("Constant size is 25, given length is " + length); + } + this.bs = bytesStore; + this.offset = offset; + } + + @Override + public BytesStore bytesStore() { + return bs; + } + + @Override + public long offset() { + return offset; + } + + @Override + public long maxSize() { + return 25; + } +} diff --git a/src/main/java/net/openhft/chronicle/map/ReplicatedGlobalMutableState$$Native.java b/src/main/java/net/openhft/chronicle/map/ReplicatedGlobalMutableState$$Native.java new file mode 100644 index 000000000..cc6783b80 --- /dev/null +++ b/src/main/java/net/openhft/chronicle/map/ReplicatedGlobalMutableState$$Native.java @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2016 higherfrequencytrading.com + * Copyright (C) 2016 Roman Leventov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package net.openhft.chronicle.map; + +import java.lang.ArrayIndexOutOfBoundsException; +import java.lang.IllegalArgumentException; +import java.lang.IllegalStateException; +import java.lang.Object; +import java.lang.Override; +import java.lang.String; +import java.lang.StringBuilder; +import net.openhft.chronicle.bytes.Byteable; +import net.openhft.chronicle.bytes.BytesIn; +import net.openhft.chronicle.bytes.BytesMarshallable; +import net.openhft.chronicle.bytes.BytesOut; +import net.openhft.chronicle.bytes.BytesStore; +import net.openhft.chronicle.values.Copyable; + +/** + * This class is a dumped output of {@link ReplicatedGlobalMutableState#main(String[])}. Chronicle + * Values still have problems with class loading in OSGi/container/module environments. Dumping the + * class is a practical workaround for Chronicle Map users who don't need Value-interface keys or + * values, until Chronicle Values learn how to generate classes in compile time. + * + * @deprecated don't use this class directly, it might be removed in the future versions. Use + * {@link net.openhft.chronicle.values.Values#nativeClassFor(Class) + * Values.nativeClassFor(ReplicatedGlobalMutableState.class)} + */ +@Deprecated +public class ReplicatedGlobalMutableState$$Native implements ReplicatedGlobalMutableState, Copyable, BytesMarshallable, Byteable { + private BytesStore bs; + + private long offset; + + @Override + public int getAllocatedExtraTierBulks() { + return (bs.readInt(offset + 0)) & ((1 << 24) - 1); + } + + @Override + public void setAllocatedExtraTierBulks(int _allocatedExtraTierBulks) { + if (_allocatedExtraTierBulks < 0 || _allocatedExtraTierBulks > 16777215) { + throw new IllegalArgumentException("_allocatedExtraTierBulks should be in [0, 16777215] range, " + _allocatedExtraTierBulks + " is given"); + } + bs.writeInt(offset + 0, ((bs.readInt(offset + 0)) & 0xFF000000) | (_allocatedExtraTierBulks)); + } + + @Override + public long getFirstFreeTierIndex() { + return (bs.readLong(offset + 3)) & ((1L << 40) - 1); + } + + @Override + public void setFirstFreeTierIndex(long _firstFreeTierIndex) { + if (_firstFreeTierIndex < 0 || _firstFreeTierIndex > 1099511627775L) { + throw new IllegalArgumentException("_firstFreeTierIndex should be in [0, 1099511627775] range, " + _firstFreeTierIndex + " is given"); + } + bs.writeLong(offset + 3, ((bs.readLong(offset + 3)) & 0xFFFFFF0000000000L) | (_firstFreeTierIndex)); + } + + @Override + public long getExtraTiersInUse() { + return (bs.readLong(offset + 8)) & ((1L << 40) - 1); + } + + @Override + public void setExtraTiersInUse(long _extraTiersInUse) { + if (_extraTiersInUse < 0 || _extraTiersInUse > 1099511627775L) { + throw new IllegalArgumentException("_extraTiersInUse should be in [0, 1099511627775] range, " + _extraTiersInUse + " is given"); + } + bs.writeLong(offset + 8, ((bs.readLong(offset + 8)) & 0xFFFFFF0000000000L) | (_extraTiersInUse)); + } + + @Override + public long getSegmentHeadersOffset() { + return (bs.readInt(offset + 13)) & 0xFFFFFFFFL; + } + + @Override + public void setSegmentHeadersOffset(long _segmentHeadersOffset) { + if (_segmentHeadersOffset < 0 || _segmentHeadersOffset > 4294967295L) { + throw new IllegalArgumentException("_segmentHeadersOffset should be in [0, 4294967295] range, " + _segmentHeadersOffset + " is given"); + } + bs.writeInt(offset + 13, (int) (_segmentHeadersOffset)); + } + + @Override + public long getDataStoreSize() { + return bs.readLong(offset + 17); + } + + @Override + public void setDataStoreSize(long _dataStoreSize) { + if (_dataStoreSize < 0) { + throw new IllegalArgumentException("_dataStoreSize should be in [0, 9223372036854775807] range, " + _dataStoreSize + " is given"); + } + bs.writeLong(offset + 17, _dataStoreSize); + } + + @Override + public long addDataStoreSize(long addition) { + long oldDataStoreSize = bs.readLong(offset + 17); + long newDataStoreSize = oldDataStoreSize + addition; + if (newDataStoreSize < 0) { + throw new IllegalStateException("bs.readLong(offset + 17) should be in [0, 9223372036854775807] range, the value was " + oldDataStoreSize + ", + " + addition + " = " + newDataStoreSize + " out of the range"); + } + bs.writeLong(offset + 17, newDataStoreSize); + return newDataStoreSize; + } + + @Override + public int getCurrentCleanupSegmentIndex() { + return bs.readInt(offset + 25); + } + + @Override + public void setCurrentCleanupSegmentIndex(int _currentCleanupSegmentIndex) { + if (_currentCleanupSegmentIndex < 0) { + throw new IllegalArgumentException("_currentCleanupSegmentIndex should be in [0, 2147483647] range, " + _currentCleanupSegmentIndex + " is given"); + } + bs.writeInt(offset + 25, _currentCleanupSegmentIndex); + } + + @Override + public int getModificationIteratorsCount() { + return (bs.readByte(offset + 29)) & 0xFF; + } + + @Override + public int addModificationIteratorsCount(int addition) { + int oldModificationIteratorsCount = (bs.readByte(offset + 29)) & 0xFF; + int newModificationIteratorsCount = oldModificationIteratorsCount + addition; + if (newModificationIteratorsCount < 0 || newModificationIteratorsCount > 128) { + throw new IllegalStateException("(bs.readByte(offset + 29)) & 0xFF should be in [0, 128] range, the value was " + oldModificationIteratorsCount + ", + " + addition + " = " + newModificationIteratorsCount + " out of the range"); + } + bs.writeByte(offset + 29, (byte) (newModificationIteratorsCount)); + return newModificationIteratorsCount; + } + + @Override + public boolean getModificationIteratorInitAt(int index) { + if (index < 0 || index >= 128) { + throw new ArrayIndexOutOfBoundsException(index + " is out of bounds, array length 128"); + } + int bitOffset = 240 + index; + int byteOffset = bitOffset / 8; + int bitShift = bitOffset & 7; + return (bs.readByte(offset + byteOffset) & (1 << bitShift)) != 0; + } + + @Override + public void setModificationIteratorInitAt(int index, boolean _modificationIteratorInit) { + if (index < 0 || index >= 128) { + throw new ArrayIndexOutOfBoundsException(index + " is out of bounds, array length 128"); + } + int bitOffset = 240 + index; + int byteOffset = bitOffset / 8; + int bitShift = bitOffset & 7; + int b = bs.readByte(offset + byteOffset); + if (_modificationIteratorInit) { + b |= (1 << bitShift); + } else { + b &= ~(1 << bitShift); + } + bs.writeByte(offset + byteOffset, (byte) b); + } + + @Override + public void copyFrom(ReplicatedGlobalMutableState from) { + setAllocatedExtraTierBulks(from.getAllocatedExtraTierBulks()); + setFirstFreeTierIndex(from.getFirstFreeTierIndex()); + setExtraTiersInUse(from.getExtraTiersInUse()); + setSegmentHeadersOffset(from.getSegmentHeadersOffset()); + setDataStoreSize(from.getDataStoreSize()); + setCurrentCleanupSegmentIndex(from.getCurrentCleanupSegmentIndex()); + int _modificationIteratorsCount = from.getModificationIteratorsCount(); + if (_modificationIteratorsCount < 0 || _modificationIteratorsCount > 128) { + throw new IllegalArgumentException("_modificationIteratorsCount should be in [0, 128] range, " + _modificationIteratorsCount + " is given"); + } + bs.writeByte(offset + 29, (byte) (_modificationIteratorsCount)); + for (int index = 0; index < 128; index++) { + setModificationIteratorInitAt(index, from.getModificationIteratorInitAt(index)); + } + } + + @Override + public void writeMarshallable(BytesOut bytes) { + bytes.writeInt((bs.readInt(offset + 0)) & ((1 << 24) - 1)); + bytes.writeLong((bs.readLong(offset + 3)) & ((1L << 40) - 1)); + bytes.writeLong((bs.readLong(offset + 8)) & ((1L << 40) - 1)); + bytes.writeLong((bs.readInt(offset + 13)) & 0xFFFFFFFFL); + bytes.writeLong(bs.readLong(offset + 17)); + bytes.writeInt(bs.readInt(offset + 25)); + bytes.writeInt((bs.readByte(offset + 29)) & 0xFF); + for (int index = 0; index < 128; index++) { + bytes.writeBoolean(getModificationIteratorInitAt(index)); + } + } + + @Override + public void readMarshallable(BytesIn bytes) { + bs.writeInt(offset + 0, ((bs.readInt(offset + 0)) & 0xFF000000) | (bytes.readInt())); + bs.writeLong(offset + 3, ((bs.readLong(offset + 3)) & 0xFFFFFF0000000000L) | (bytes.readLong())); + bs.writeLong(offset + 8, ((bs.readLong(offset + 8)) & 0xFFFFFF0000000000L) | (bytes.readLong())); + bs.writeInt(offset + 13, (int) (bytes.readLong())); + bs.writeLong(offset + 17, bytes.readLong()); + bs.writeInt(offset + 25, bytes.readInt()); + bs.writeByte(offset + 29, (byte) (bytes.readInt())); + for (int index = 0; index < 128; index++) { + setModificationIteratorInitAt(index, bytes.readBoolean()); + } + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ReplicatedGlobalMutableState)) return false; + ReplicatedGlobalMutableState other = (ReplicatedGlobalMutableState) obj; + if (getAllocatedExtraTierBulks() != other.getAllocatedExtraTierBulks()) return false; + if (getFirstFreeTierIndex() != other.getFirstFreeTierIndex()) return false; + if (getExtraTiersInUse() != other.getExtraTiersInUse()) return false; + if (getSegmentHeadersOffset() != other.getSegmentHeadersOffset()) return false; + if (getDataStoreSize() != other.getDataStoreSize()) return false; + if (getCurrentCleanupSegmentIndex() != other.getCurrentCleanupSegmentIndex()) return false; + if (getModificationIteratorsCount() != other.getModificationIteratorsCount()) return false; + for (int index = 0; index < 128; index++) { + if (getModificationIteratorInitAt(index) != other.getModificationIteratorInitAt(index)) return false; + } + return true; + } + + @Override + public int hashCode() { + int hashCode = 1; + hashCode *= 1000003; + hashCode ^= java.lang.Integer.hashCode(getAllocatedExtraTierBulks()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getFirstFreeTierIndex()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getExtraTiersInUse()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getSegmentHeadersOffset()); + hashCode *= 1000003; + hashCode ^= java.lang.Long.hashCode(getDataStoreSize()); + hashCode *= 1000003; + hashCode ^= java.lang.Integer.hashCode(getCurrentCleanupSegmentIndex()); + hashCode *= 1000003; + hashCode ^= java.lang.Integer.hashCode(getModificationIteratorsCount()); + hashCode *= 1000003; + int _modificationIteratorInitHashCode = 1; + for (int index = 0; index < 128; index++) { + _modificationIteratorInitHashCode *= 1000003; + _modificationIteratorInitHashCode ^= Boolean.hashCode(getModificationIteratorInitAt(index)); + } + hashCode ^= _modificationIteratorInitHashCode; + return hashCode; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("ReplicatedGlobalMutableState"); + sb.append(", allocatedExtraTierBulks=").append(getAllocatedExtraTierBulks()); + sb.append(", firstFreeTierIndex=").append(getFirstFreeTierIndex()); + sb.append(", extraTiersInUse=").append(getExtraTiersInUse()); + sb.append(", segmentHeadersOffset=").append(getSegmentHeadersOffset()); + sb.append(", dataStoreSize=").append(getDataStoreSize()); + sb.append(", currentCleanupSegmentIndex=").append(getCurrentCleanupSegmentIndex()); + sb.append(", modificationIteratorsCount=").append(getModificationIteratorsCount()); + sb.append(", modificationIteratorInit=["); + for (int index = 0; index < 128; index++) { + sb.append(getModificationIteratorInitAt(index)).append(',').append(' '); + } + sb.setCharAt(sb.length() - 2, ']'); + sb.setLength(sb.length() - 1); + sb.setCharAt(28, '{'); + sb.append(' ').append('}'); + return sb.toString(); + } + + @Override + public void bytesStore(BytesStore bytesStore, long offset, long length) { + if (length != maxSize()) { + throw new IllegalArgumentException("Constant size is 46, given length is " + length); + } + this.bs = bytesStore; + this.offset = offset; + } + + @Override + public BytesStore bytesStore() { + return bs; + } + + @Override + public long offset() { + return offset; + } + + @Override + public long maxSize() { + return 46; + } +}