/*
* Copyright (C) 2009.
*
* 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.imgfmt.app.mdr;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import uk.me.parabola.imgfmt.app.srt.Sort;
import uk.me.parabola.imgfmt.app.srt.SortKey;
/**
* A bunch of static routines for use in creating the MDR file.
*/
public class MdrUtils {
public static final int STREET_INDEX_PREFIX_LEN = 4;
public static final int POI_INDEX_PREFIX_LEN = 4;
/**
* Get the group number for the poi. This is the first byte of the records
* in mdr9.
*
* Not entirely sure about how this works yet.
* @param fullType The primary type of the object.
* @return The group number. This is a number between 1 and 9 (and later
* perhaps higher numbers such as 0x40, so do not assume there are no
* gaps).
*/
public static int getGroupForPoi(int fullType) {
// We group pois based on their type. This may not be the final thoughts on this.
int type = MdrUtils.getTypeFromFullType(fullType);
int group = 0;
if (fullType < 0xf)
group = 1;
else if (type >= 0x2a && type <= 0x30) {
group = type - 0x28;
} else if (type == 0x28) {
group = 9;
}
return group;
}
public static boolean canBeIndexed(int fullType) {
return getGroupForPoi(fullType) != 0;
}
private static int getTypeFromFullType(int fullType) {
if ((fullType & 0xfff00) > 0)
return (fullType>>8) & 0xfff;
else
return fullType & 0xff;
}
/**
* Gets the subtype if there is one, else the type.
* @param fullType The type in the so-called 'full' format.
* @return If there is a subtype, then it is returned. Otherwise the type is returned.
*/
public static int getSubtypeOrTypeFromFullType(int fullType) {
return fullType & 0xff;
}
/**
* Sort records that are sorted by a name. They appropriate sort order will be used.
* @param sort The sort to be applied.
* @param list The list to be sorted.
* @param <T> One of the Mdr?Record types that need to be sorted on a text field, eg street name.
* @return A list of sort keys in the sorted order. The original object is retrieved from the key
* by calling getObject().
*/
public static <T extends NamedRecord> List<SortKey<T>> sortList(Sort sort, List<T> list) {
List<SortKey<T>> toSort = new ArrayList<SortKey<T>>(list.size());
for (T m : list) {
SortKey<T> sortKey = sort.createSortKey(m, m.getName(), m.getMapIndex());
toSort.add(sortKey);
}
Collections.sort(toSort);
return toSort;
}
/**
* The 'natural' type is always a combination of the type and subtype with the type
* shifted 5 bits and the sub type in the low 5 bits.
*
* For various reasons, we use 'fullType' in which the type is shifted up a full byte
* or is in the lower byte.
*
* @param ftype The so-called full type of the object.
* @return The natural type as defined above.
*/
public static int fullTypeToNaturalType(int ftype) {
int type = getTypeFromFullType(ftype);
int sub = 0;
if ((ftype & ~0xff) != 0)
sub = ftype & 0x1f;
return type << 5 | sub;
}
}