| 668 | } |
| 669 | |
| 670 | static 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 | } |
nothing calls this directly
no outgoing calls
no test coverage detected