/*
* Licensed to GraphHopper GmbH under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* GraphHopper GmbH licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.graphhopper.routing.ch;
/**
* The flags are stored differently for shortcuts: just one weight and the two direction bits which is handled by this
* class for now as static methods.
*
* @author Peter Karich
*/
public class PrepareEncoder {
// shortcut goes in one or both directions is also possible if weight is identical
private static final long scFwdDir = 0x1;
private static final long scBwdDir = 0x2;
private static final long scDirMask = 0x3;
/**
* A bitmask for two directions
*/
public static final long getScDirMask() {
return scDirMask;
}
/**
* The bit for forward direction
*/
public static final long getScFwdDir() {
return scFwdDir;
}
/**
* The bit for backward direction
*/
public static final long getScBwdDir() {
return scBwdDir;
}
/**
* Returns 1 if existingScFlags of an existing shortcut can be overwritten with a new shortcut by
* newScFlags without limiting or changing the directions of the existing shortcut.
* The method returns 2 for the same condition but only if the new shortcut has to be added
* even if weight is higher than existing shortcut weight.
* <pre>
* | newScFlags:
* existingScFlags | -> | <- | <->
* -> | 1 | 0 | 2
* <- | 0 | 1 | 2
* <-> | 0 | 0 | 1
* </pre>
*
* @return 1 if newScFlags is identical to existingScFlags for the two direction bits and 0 otherwise.
* There are two special cases when it returns 2.
*/
public static final int getScMergeStatus(long existingScFlags, long newScFlags) {
if ((existingScFlags & scDirMask) == (newScFlags & scDirMask))
return 1;
else if ((newScFlags & scDirMask) == scDirMask)
return 2;
return 0;
}
}