CI coveralls crates.io doc.rs

sqrid

sqrid provides square grid coordinates and related operations, in a single-file create, with no dependencies.

Qa: absolute coordinates, position

The [Qa] type represents an absolute position in a square grid. The type itself receives the height and width of the grid as const generic parameter.

We should usually create a type alias for the grid size we are using:

```rust use sqrid;

type Qa = sqrid::Qa<6, 7>; ```

We can get [Qa] instances by: - Using one of the const associated items: rust type Qa = sqrid::Qa<6, 7>; const MyFirst : Qa = Qa::FIRST; const MyLast : Qa = Qa::LAST; - Using try_from with a (i16, i16) tuple or a tuple reference: ```rust use std::convert::TryFrom; use std::error::Error;

type Qa = sqrid::Qa<6, 7>; const MyFirst : Qa = Qa::FIRST;

fn main() -> Result<(), Box> { let qa1 = Qa::tryfrom((2i16, 3_i16))?;

  println!("qa1: {}", qa1);
  Ok(())

} - Calling [`Qa::new`], which checks the bounds in const contexts: rust type Qa = sqrid::Qa<6, 7>; const MYFIRST : Qa = Qa::new::<3, 4>(); The following, for instance, doesn't compile: rust type Qa = sqrid::Qa<6, 7>; const MYFIRST : Qa = Qa::new::<12, 4>(); - Calling [`Qa::iter`] to iterate all coordinates in the grid: rust type Qa = sqrid::Qa<6, 7>; for qa in Qa::iter() { println!("{}", qa); } ```

Qr: relative coordinates, direction, movement

This type represents a relative movement of one square. It can only be one of the 4 cardinal directions (N, E, S, W) if the DIAG argument is false, or one of the 8 directions when it's true.

It's a building block for paths, iterating on a [Qa] neighbors, etc. It effectively represents the edges in a graph where the [Qa] type represents nodes.

We can get [Qr] instances by: - Using one of the const associated items that represent all cardinal directions (recommended): rust use sqrid::Qr; const Right : Qr<false> = Qr::E; const Down : Qr<false> = Qr::S; - Using try_from with a (i16, i16) tuple or a tuple reference: ```rust use std::convert::TryFrom; use std::error::Error;

use sqrid::Qr;

fn main() -> Result<(), Box> { // Re-create West: let qr1 = Qr::::tryfrom((0i16, -1i16))?; // Re-create Northeast: let qr2 = Qr::::tryfrom((-1i16, 1i16))?; Ok(()) } - Calling [`Qr::new`], which checks the bounds in const contexts: rust use sqrid::Qr; const DOWNRIGHT : Qr = Qr::::new::<1, 1>(); The following, for instance, doesn't compile due to the argument being false, which means that diagonals are not supported: rust use sqrid::Qr; const DOWNRIGHT : Qr = Qr::::new::<1, 1>(); - Calling [`Qr::iter`] to iterate all directions: rust for qr in sqrid::Qr::::iter() { println!("{}", qr); } ```