List of usage examples for org.apache.thrift.protocol TTupleProtocol writeBitSet
public void writeBitSet(BitSet bs, int vectorWidth) throws TException
From source file:net.morimekta.providence.thrift.TTupleProtocolSerializer.java
License:Apache License
private void writeMessage(PMessage<?, ?> message, TTupleProtocol protocol) throws TException, SerializerException { PMessageDescriptor<?, ?> descriptor = message.descriptor(); if (descriptor.getVariant() == PMessageVariant.UNION) { PField fld = ((PUnion<?, ?>) message).unionField(); protocol.writeI16((short) fld.getKey()); writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol); } else {//w ww . j a v a2 s. c o m PField[] fields = descriptor.getFields(); Arrays.sort(fields, (a, b) -> Integer.compare(a.getKey(), b.getKey())); int numOptionals = countOptionals(fields); BitSet optionals = new BitSet(); if (numOptionals > 0) { int optionalPos = 0; for (PField fld : fields) { if (fld.getRequirement() != PRequirement.REQUIRED) { if (message.has(fld.getKey())) { optionals.set(optionalPos); } ++optionalPos; } } } boolean shouldWriteOptionals = true; int optionalPos = 0; for (PField fld : fields) { if (fld.getRequirement() == PRequirement.REQUIRED) { writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol); } else { // Write the optionals bitset at the position of the first // non-required field. if (shouldWriteOptionals) { protocol.writeBitSet(optionals, numOptionals); shouldWriteOptionals = false; } if (optionals.get(optionalPos)) { writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol); } ++optionalPos; } } } }