Subversion Repositories splitter

Rev

Rev 263 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2012.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program 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.
 */

 package uk.me.parabola.splitter;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;

/**
 * Maps a BitSet containing the used writers to an integer value.  
 * An OSM element is written to one or more writers. Every used
 * combination of writers is translated to an integer.
 * Use this dictionary if you expect many different writer combinations,
 * e.g. for relations and their members.
 * @author GerdP
 *
 */

public class WriterDictionaryInt{
        public final static int UNASSIGNED = -1;
        private final ArrayList<BitSet> sets;
        private final int numOfWriters;
        private final HashMap<BitSet, Integer> index;
       
        /**
         * Create a dictionary for a given number of writers
         * @param numOfWriters the number of writers that are used
         */

        WriterDictionaryInt (OSMWriter [] writers){
                this.numOfWriters = writers.length;
                sets = new ArrayList<BitSet>();
                index = new HashMap<BitSet, Integer>();
                init();
        }
       
        /**
         * initialize the dictionary with sets containing a single writer.
         */

        private void init(){
                ArrayList<BitSet> writerSets = new ArrayList<BitSet>(numOfWriters);
                for (int i=0; i < numOfWriters; i++){
                        BitSet b = new BitSet();
                        b.set(i);
                        translate(b);
                        writerSets.add(b);
                }
        }
       
        /**
         * Calculate the integer value for a given BitSet. The BitSet must not
         * contain values higher than numOfWriters.
         * @param writerSet the BitSet
         * @return an int value that identifies this BitSet
         */

        public int translate(final BitSet writerSet){
                Integer combiIndex = index.get(writerSet);
                if (combiIndex == null){
                        BitSet bnew = new BitSet();

                        bnew.or(writerSet);
                        combiIndex = sets.size();
                        sets.add(bnew);
                        index.put(bnew, combiIndex);
                }
                return combiIndex;
        }

        /**
         * Return the BitSet that is related to the int value.
         * The caller must make sure that the idx is valid.
         * @param idx an int value that was returned by the translate()
         * method.  
         * @return the BitSet
         */

        public BitSet getBitSet (final int idx){
                return sets.get(idx);
        }
       
        /**
         * return the number of sets in this dictionary
         * @return the number of sets in this dictionary
         */

        public int size(){
                return sets.size();
        }

        public int getNumOfWriters(){
                return numOfWriters;
        }

        /**
         * return the id of a single writer or
         * @param writerIdx
         * @return
         */

        public boolean isSingleWriterIdx(int writerIdx) {
                return (writerIdx < numOfWriters);
        }

}