MCPcopy Index your code
hub / github.com/clojure/clojure / TransientVector

Class TransientVector

src/jvm/clojure/lang/PersistentVector.java:670–968  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

668}
669
670static final class TransientVector extends AFn implements ITransientVector, ITransientAssociative2, Counted{
671 volatile int cnt;
672 volatile int shift;
673 volatile Node root;
674 volatile Object[] tail;
675
676 TransientVector(int cnt, int shift, Node root, Object[] tail){
677 this.cnt = cnt;
678 this.shift = shift;
679 this.root = root;
680 this.tail = tail;
681 }
682
683 TransientVector(PersistentVector v){
684 this(v.cnt, v.shift, editableRoot(v.root), editableTail(v.tail));
685 }
686
687 public int count(){
688 ensureEditable();
689 return cnt;
690 }
691
692 Node ensureEditable(Node node){
693 if(node.edit == root.edit)
694 return node;
695 return new Node(root.edit, node.array.clone());
696 }
697
698 void ensureEditable(){
699 if(root.edit.get() == null)
700 throw new IllegalAccessError("Transient used after persistent! call");
701
702// root = editableRoot(root);
703// tail = editableTail(tail);
704 }
705
706 static Node editableRoot(Node node){
707 return new Node(new AtomicReference<Thread>(Thread.currentThread()), node.array.clone());
708 }
709
710 public PersistentVector persistent(){
711 ensureEditable();
712// Thread owner = root.edit.get();
713// if(owner != null && owner != Thread.currentThread())
714// {
715// throw new IllegalAccessError("Mutation release by non-owner thread");
716// }
717 root.edit.set(null);
718 Object[] trimmedTail = new Object[cnt-tailoff()];
719 System.arraycopy(tail,0,trimmedTail,0,trimmedTail.length);
720 return new PersistentVector(cnt, shift, root, trimmedTail);
721 }
722
723 static Object[] editableTail(Object[] tl){
724 Object[] ret = new Object[32];
725 System.arraycopy(tl,0,ret,0,tl.length);
726 return ret;
727 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected