<commit_before>/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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 fr.ritaly.dungeonmaster;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;

/**
 * Reprsente des coordonnes en 3 dimensions dans un donjon.
 * 
 * @author <a href="mailto:<EMAIL>"><NAME></a>
 */
public final class Position {

	public final int x, y, z;

	private final int hash;

	private final String toString;

	// FIXME Masquer ce constructeur pour rutiliser les instances -> valueOf(x, y, z)
	public Position(int x, int y, int z) {
		this.x = x;
		this.y = y;
		this.z = z;

		this.toString = "[" + z + ":" + x + "," + y + "]";

		int hashCode = 17;

		hashCode = (hashCode * 31) + x;
		hashCode = (hashCode * 31) + y;
		hashCode = (hashCode * 31) + z;

		this.hash = hashCode;
	}

	@Override
	public final String toString() {
		return toString;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (obj == this) {
			return true;
		}
		if (obj instanceof Position) {
			final Position position = (Position) obj;

			return (this.x == position.x) && (this.y == position.y)
					&& (this.z == position.z);
		}

		return false;
	}

	@Override
	public int hashCode() {
		return hash;
	}

	/**
	 * Indique si cette {@link Position} est proche de la {@link Position}
	 * donne. Deux {@link Position}s sont proches quand le nombre de mouvements
	 * ncessaire pour passer de l'une  l'autre est gal  1.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return
	 */
	public boolean isCloseTo(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		final boolean sameX = (this.x == position.x);
		final boolean sameY = (this.y == position.y);
		final boolean sameZ = (this.z == position.z);
		final boolean nearX = (Math.abs(this.x - position.x) == 1);
		final boolean nearY = (Math.abs(this.y - position.y) == 1);

		return sameZ
				&& ((sameX && nearY) || (nearX && sameY) || (nearX && nearY));
	}

	/**
	 * Indique si cette {@link Position} est aligne (le long de l'axe de X)
	 * avec la {@link Position} donne.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return si cette {@link Position} est aligne (le long de l'axe de X)
	 *         avec la {@link Position} donne.
	 */
	public boolean isAlignedX(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		return this.x == position.x;
	}

	/**
	 * Indique si cette {@link Position} est aligne (le long de l'axe de Y)
	 * avec la {@link Position} donne.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return si cette {@link Position} est aligne (le long de l'axe de Y)
	 *         avec la {@link Position} donne.
	 */
	public boolean isAlignedY(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		return this.y == position.y;
	}

	public Position towards(Direction direction) {
		Validate.notNull(direction, "The given direction is null");

		return direction.change(this);
	}

	public Position getUpper() {
		return towards(Direction.UP);
	}

	public Position getLower() {
		return towards(Direction.DOWN);
	}

	/**
	 * Retourne une liste contenant les 8 positions entourant cette
	 * {@link Position}.
	 * 
	 * @return une {@link List} de {@link Position}s.
	 */
	public List<Position> getSurroundingPositions() {
		// Rechercher les positions voisines dans un rayon de 1
		return getSurroundingPositions(1);
	}

	/**
	 * Retourne une liste contenant les positions entourant cette
	 * {@link Position} dans le rayon donn.
	 * 
	 * @param radius
	 *            un entier reprsentant le rayon en nombre de cases voisines.
	 * 
	 * @return une {@link List} de {@link Position}s.
	 */
	public List<Position> getSurroundingPositions(int radius) {
		Validate.isTrue(radius >= 1, "The given radius must be positive");<commit_msg>Removed 2 methods from Position<commit_after>/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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 fr.ritaly.dungeonmaster;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;

/**
 * Reprsente des coordonnes en 3 dimensions dans un donjon.
 * 
 * @author <a href="mailto:<EMAIL>"><NAME></a>
 */
public final class Position {

	public final int x, y, z;

	private final int hash;

	private final String toString;

	// FIXME Masquer ce constructeur pour rutiliser les instances -> valueOf(x, y, z)
	public Position(int x, int y, int z) {
		this.x = x;
		this.y = y;
		this.z = z;

		this.toString = "[" + z + ":" + x + "," + y + "]";

		int hashCode = 17;

		hashCode = (hashCode * 31) + x;
		hashCode = (hashCode * 31) + y;
		hashCode = (hashCode * 31) + z;

		this.hash = hashCode;
	}

	@Override
	public final String toString() {
		return toString;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (obj == this) {
			return true;
		}
		if (obj instanceof Position) {
			final Position position = (Position) obj;

			return (this.x == position.x) && (this.y == position.y)
					&& (this.z == position.z);
		}

		return false;
	}

	@Override
	public int hashCode() {
		return hash;
	}

	/**
	 * Indique si cette {@link Position} est proche de la {@link Position}
	 * donne. Deux {@link Position}s sont proches quand le nombre de mouvements
	 * ncessaire pour passer de l'une  l'autre est gal  1.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return
	 */
	public boolean isCloseTo(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		final boolean sameX = (this.x == position.x);
		final boolean sameY = (this.y == position.y);
		final boolean sameZ = (this.z == position.z);
		final boolean nearX = (Math.abs(this.x - position.x) == 1);
		final boolean nearY = (Math.abs(this.y - position.y) == 1);

		return sameZ
				&& ((sameX && nearY) || (nearX && sameY) || (nearX && nearY));
	}

	/**
	 * Indique si cette {@link Position} est aligne (le long de l'axe de X)
	 * avec la {@link Position} donne.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return si cette {@link Position} est aligne (le long de l'axe de X)
	 *         avec la {@link Position} donne.
	 */
	public boolean isAlignedX(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		return this.x == position.x;
	}

	/**
	 * Indique si cette {@link Position} est aligne (le long de l'axe de Y)
	 * avec la {@link Position} donne.
	 * 
	 * @param position
	 *            une instance de {@link Position}.
	 * @return si cette {@link Position} est aligne (le long de l'axe de Y)
	 *         avec la {@link Position} donne.
	 */
	public boolean isAlignedY(Position position) {
		if (position == null) {
			throw new IllegalArgumentException("The given position is null");
		}

		return this.y == position.y;
	}

	public Position towards(Direction direction) {
		Validate.notNull(direction, "The given direction is null");

		return direction.change(this);
	}

	/**
	 * Retourne une liste contenant les 8 positions entourant cette
	 * {@link Position}.
	 * 
	 * @return une {@link List} de {@link Position}s.
	 */
	public List<Position> getSurroundingPositions() {
		// Rechercher les positions voisines dans un rayon de 1
		return getSurroundingPositions(1);
	}

	/**
	 * Retourne une liste contenant les positions entourant cette
	 * {@link Position} dans le rayon donn.
	 * 
	 * @param radius
	 *            un entier reprsentant le rayon en nombre de cases voisines.
	 * 
	 * @return une {@link List} de {@link Position}s.
	 */
	public List<Position> getSurroundingPositions(int radius) {
		Validate.isTrue(radius >= 1, "The given radius must be positive");
{'fraction_non_alphanumeric': 0.11634233103159657, 'fraction_numerical': 0.004289600334798075, 'mean_word_length': 3.2017582417582418, 'pattern_counts': {'":': 2, '<': 15, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7053897', 'n_tokens_mistral': 3161, 'n_tokens_neox': 2895, 'n_words': 1095}