blob: ff33b1b7fcbbfa238ecd07951d645bc175726223 [file] [log] [blame]
/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
*
* This program and the accompanying materials are made available under
* the terms of the Common Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/cpl-v10.html
*
* $Id: ItemComparator.java,v 1.1.1.1 2004/05/09 16:57:37 vlad_r Exp $
*/
package com.vladium.emma.report;
import java.util.Comparator;
// ----------------------------------------------------------------------------
/**
* @author Vlad Roubtsov, (C) 2003
*/
public
interface ItemComparator extends Comparator
{
// public: ................................................................
ItemComparator NULL_COMPARATOR = new Factory.NullComparator ();
abstract class Factory
{
public static ItemComparator create (final int [] attributeIDsWithDir, final int unitsID)
{
if (attributeIDsWithDir == null)
throw new IllegalArgumentException ("null input: attributeIDsWithDir");
if (attributeIDsWithDir.length == 0)
return NULL_COMPARATOR;
// TODO: validate against duplicates
// TODO: memoize
// TODO: move the code below into the attr factory
final Comparator [] comparators = new Comparator [attributeIDsWithDir.length >> 1];
for (int a = 0; a < attributeIDsWithDir.length; a += 2)
{
final int attributeID = attributeIDsWithDir [a];
final Comparator comparator = IItemAttribute.Factory.getAttribute (attributeID, unitsID).comparator ();
comparators [a >> 1] = attributeIDsWithDir [a + 1] < 0 ? new ReverseComparator (comparator) : comparator;
}
return new CompositeComparator (comparators);
}
private static final class NullComparator implements ItemComparator
{
public int compare (final Object l, final Object g)
{
return 0;
}
} // end of nested class
private static final class ReverseComparator implements ItemComparator
{
public int compare (final Object l, final Object g)
{
return m_comparator.compare (g, l);
}
ReverseComparator (final Comparator comparator)
{
m_comparator = comparator;
}
private final Comparator m_comparator;
} // end of nested class
private static final class CompositeComparator implements ItemComparator
{
public int compare (final Object l, final Object g)
{
// TODO: this needs to check whether both items have a given attr type
for (int c = 0; c < m_comparators.length; ++ c)
{
final int diff = m_comparators [c].compare (l, g);
if (diff != 0) return diff;
}
return 0;
}
CompositeComparator (final Comparator [] comparators)
{
m_comparators = comparators;
}
private final Comparator [] m_comparators;
} // end of nested class
} // end of nested interface
} // end of interface
// ----------------------------------------------------------------------------