| 22 | import java.util.function.Consumer; |
| 23 | |
| 24 | public class PersistentVector extends APersistentVector implements IObj, IEditableCollection, IReduce, IKVReduce, IDrop{ |
| 25 | |
| 26 | private static final long serialVersionUID = -7896022351281214157L; |
| 27 | |
| 28 | public static class Node implements Serializable { |
| 29 | transient public final AtomicReference<Thread> edit; |
| 30 | public final Object[] array; |
| 31 | |
| 32 | public Node(AtomicReference<Thread> edit, Object[] array){ |
| 33 | this.edit = edit; |
| 34 | this.array = array; |
| 35 | } |
| 36 | |
| 37 | Node(AtomicReference<Thread> edit){ |
| 38 | this.edit = edit; |
| 39 | this.array = new Object[32]; |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | final static AtomicReference<Thread> NOEDIT = new AtomicReference<Thread>(null); |
| 44 | public final static Node EMPTY_NODE = new Node(NOEDIT, new Object[32]); |
| 45 | |
| 46 | final int cnt; |
| 47 | public final int shift; |
| 48 | public final Node root; |
| 49 | public final Object[] tail; |
| 50 | final IPersistentMap _meta; |
| 51 | |
| 52 | |
| 53 | public final static PersistentVector EMPTY = new PersistentVector(0, 5, EMPTY_NODE, new Object[]{}); |
| 54 | |
| 55 | private static final IFn TRANSIENT_VECTOR_CONJ = new AFn() { |
| 56 | public Object invoke(Object coll, Object val) { |
| 57 | return ((ITransientVector)coll).conj(val); |
| 58 | } |
| 59 | public Object invoke(Object coll) { |
| 60 | return coll; |
| 61 | } |
| 62 | }; |
| 63 | |
| 64 | static public PersistentVector adopt(Object [] items){ |
| 65 | return new PersistentVector(items.length, 5, EMPTY_NODE, items); |
| 66 | } |
| 67 | |
| 68 | static public PersistentVector create(IReduceInit items) { |
| 69 | TransientVector ret = EMPTY.asTransient(); |
| 70 | items.reduce(TRANSIENT_VECTOR_CONJ, ret); |
| 71 | return ret.persistent(); |
| 72 | } |
| 73 | |
| 74 | static public PersistentVector create(ISeq items){ |
| 75 | Object[] arr = new Object[32]; |
| 76 | int i = 0; |
| 77 | for(;items != null && i < 32; items = items.next()) |
| 78 | arr[i++] = items.first(); |
| 79 | |
| 80 | if(items != null) { // >32, construct with array directly |
| 81 | PersistentVector start = new PersistentVector(32, 5, EMPTY_NODE, arr); |
nothing calls this directly
no outgoing calls
no test coverage detected