/* This file is part of the db4o object database http://www.db4o.com
Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com
db4o is free software; you can redistribute it and/or modify it under
the terms of version 3 of the GNU General Public License as published
by the Free Software Foundation.
db4o 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 General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. */
package com.db4o.internal;
import com.db4o.foundation.*;
/**
* @exclude
*/
public class LockedTree {
private Tree _tree;
private int _version;
public void add(Tree tree) {
changed();
_tree = _tree == null ? tree : _tree.add(tree);
}
private void changed() {
_version++;
}
public void clear() {
changed();
_tree = null;
}
public Tree find(int key) {
return TreeInt.find(_tree, key);
}
public void read(ByteArrayBuffer buffer, Readable template) {
clear();
_tree = new TreeReader(buffer, template).read();
changed();
}
public void traverseLocked(Visitor4 visitor) {
int currentVersion = _version;
Tree.traverse(_tree, visitor);
if(_version != currentVersion){
throw new IllegalStateException();
}
}
public void traverseMutable(Visitor4 visitor){
final Collection4 currentContent = new Collection4();
traverseLocked(new Visitor4() {
public void visit(Object obj) {
currentContent.add(obj);
}
});
Iterator4 i = currentContent.iterator();
while(i.moveNext()){
visitor.visit(i.current());
}
}
public boolean isEmpty(){
return _tree == null;
}
}