jmud-0.11/
jmud-0.11/bin/
jmud-0.11/doc/
jmud-0.11/rec/
jmud-0.11/rec/mun/
jmud-0.11/rec/mun/grecia/
jmud-0.11/rec/mun/gunnar/
jmud-0.11/rec/qua/
jmud-0.11/src/bool/
jmud-0.11/src/clone/
jmud-0.11/src/integer/
jmud-0.11/src/misc/
jmud-0.11/src/string/
jmud-0.11/src/util/bit/
jmud-0.11/src/util/color/
jmud-0.11/src/util/file/
jmud-0.11/src/util/jgp/adaptor/
jmud-0.11/src/util/jgp/algorithm/
jmud-0.11/src/util/jgp/container/
jmud-0.11/src/util/jgp/functor/
jmud-0.11/src/util/jgp/interfaces/
jmud-0.11/src/util/jgp/predicate/
jmud-0.11/src/util/log/
jmud-0.11/src/util/state/
jmud-0.11/trash/
package clone;

import java.util.NoSuchElementException;

import util.nice.NiceIterator;
import util.nice.NiceEnumeration;
import misc.Separators;
import util.log.Log;

public class CloneAlgo {

  public static final int F_NAME  = 0;
  public static final int F_BRIEF = 1;

  public static void insert(CloneStore store, Clone clo) {
    if (store.isEmpty()) {
      store.insert(clo);
      return;
    }

    NiceIterator iter = store.getIterator();
    
    Clone curr = (Clone) iter.getCurrent(); 
  
    if (clo.isCloneOf(curr)) {
      store.insert(clo);
      return;
    }
    
    try {
      for ( ; ; iter.next()) {
	Clone next = (Clone) iter.getNext();
	if (clo.isCloneOf(next)) {
	  iter.insertNext(clo);
	  return;
	}
      }
    }
    catch(NoSuchElementException e) {
      store.insert(clo);
    }
  }

  static private String selectField(Clone clo, int field) {
    String str = null;
    switch(field) {
    case F_NAME:
      str = clo.getName();
      break;
    case F_BRIEF:
      str = clo.getBrief();
      break;
    }
    return str;
  }

    public static String getList(CloneStore store, Clone except, int field) {
	return getList(store, except, field, Separators.NL);
    }

  public static String getList(CloneStore store, Clone except, int field, String sep) {
    String cloneList = "";

    if (store.isEmpty()) 
      return cloneList;

    int count = 1;

    NiceEnumeration cloneEnum = store.elements();
    Clone prevClone = (Clone) cloneEnum.nextElement();

    if (prevClone == except)
      if (cloneEnum.hasMoreElements())
	prevClone = (Clone) cloneEnum.nextElement();
      else
	return cloneList;

    while (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone == except)  
	continue;
      else if (currClone.isCloneOf(prevClone))
	++count;
      else {
	cloneList += (count == 1) ? 
	  sep + selectField(prevClone, field) :
	  sep + "[" + String.valueOf(count) + "] " + 
	  selectField(prevClone, field);
	prevClone = currClone;
	count = 1;
      }
    }
    
    cloneList += (count == 1) ? 
      sep + selectField(prevClone, field) :
      sep + "[" + String.valueOf(count) + "] " + 
      selectField(prevClone, field);
    
    return cloneList;
  }


    public static String getHeadedList(CloneStore store, Clone except, int field) {
	return getHeadedList(store, except, field, Separators.NL);
    }

  public static String getHeadedList(CloneStore store, Clone except, int field, String sep) {
    String cloneList = "";

    if (store.isEmpty()) 
      return cloneList;

    int count = 1;
    int lines = 0;

    NiceEnumeration cloneEnum = store.elements();
    Clone prevClone = (Clone) cloneEnum.nextElement();

    if (prevClone == except)
      if (cloneEnum.hasMoreElements())
	prevClone = (Clone) cloneEnum.nextElement();
      else
	return cloneList;

    if (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone != except) {
	  if (currClone.isCloneOf(prevClone))
	      ++count;
	  else {
	      cloneList += (count == 1) ? 
		  selectField(prevClone, field) :
		  "[" + String.valueOf(count) + "] " + 
		  selectField(prevClone, field);
	      prevClone = currClone;
	      count = 1;
	      ++lines;
	  }
      }
    }

    while (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone == except)  
	continue;
      else if (currClone.isCloneOf(prevClone))
	++count;
      else {
	cloneList += (count == 1) ? 
	  sep + selectField(prevClone, field) :
	  sep + "[" + String.valueOf(count) + "] " + 
	  selectField(prevClone, field);
	prevClone = currClone;
	count = 1;
	++lines;
      }
    }
    
    if (lines == 0) 
	cloneList += (count == 1) ? 
	    selectField(prevClone, field) :
	"[" + String.valueOf(count) + "] " + 
	    selectField(prevClone, field);
    else
	cloneList += (count == 1) ? 
	    sep + selectField(prevClone, field) :
	sep + "[" + String.valueOf(count) + "] " + 
	    selectField(prevClone, field);
    
    return cloneList;
  }

}