int geohash_get_neighbors(const GeoHashBits* hash, GeoHashNeighbors* neighbors) { neighbors->east = *hash; neighbors->west = *hash; neighbors->north = *hash; neighbors->south = *hash; neighbors->south_east = *hash; neighbors->south_west = *hash; neighbors->north_east = *hash; neighbors->north_west = *hash; geohash_move_x(&neighbors->east, 1); geohash_move_y(&neighbors->east, 0); geohash_move_x(&neighbors->west, -1); geohash_move_y(&neighbors->west, 0); geohash_move_x(&neighbors->south, 0); geohash_move_y(&neighbors->south, -1); geohash_move_x(&neighbors->north, 0); geohash_move_y(&neighbors->north, 1); geohash_move_x(&neighbors->north_west, -1); geohash_move_y(&neighbors->north_west, 1); geohash_move_x(&neighbors->north_east, 1); geohash_move_y(&neighbors->north_east, 1); geohash_move_x(&neighbors->south_east, 1); geohash_move_y(&neighbors->south_east, -1); geohash_move_x(&neighbors->south_west, -1); geohash_move_y(&neighbors->south_west, -1); return 0; }
int geohash_get_neighbor(const GeoHashBits* hash, GeoDirection direction, GeoHashBits* neighbor) { if (NULL == neighbor) { return -1; } *neighbor = *hash; switch (direction) { case GEOHASH_NORTH: { geohash_move_x(neighbor, 0); geohash_move_y(neighbor, 1); break; } case GEOHASH_SOUTH: { geohash_move_x(neighbor, 0); geohash_move_y(neighbor, -1); break; } case GEOHASH_EAST: { geohash_move_x(neighbor, 1); geohash_move_y(neighbor, 0); break; } case GEOHASH_WEST: { geohash_move_x(neighbor, -1); geohash_move_y(neighbor, 0); break; } case GEOHASH_SOUTH_WEST: { geohash_move_x(neighbor, -1); geohash_move_y(neighbor, -1); break; } case GEOHASH_SOUTH_EAST: { geohash_move_x(neighbor, 1); geohash_move_y(neighbor, -1); break; } case GEOHASH_NORT_WEST: { geohash_move_x(neighbor, -1); geohash_move_y(neighbor, 1); break; } case GEOHASH_NORT_EAST: { geohash_move_x(neighbor, 1); geohash_move_y(neighbor, 1); break; } default: { return -1; } } return 0; }