+inline bool is_promotion(Move m) {
+ return (m & (3 << 14)) == (1 << 14);
+}
+
+inline int is_enpassant(Move m) {
+ return (m & (3 << 14)) == (2 << 14);
+}
+
+inline int is_castle(Move m) {
+ return (m & (3 << 14)) == (3 << 14);
+}
+
+inline PieceType promotion_type(Move m) {
+ return PieceType(((m >> 12) & 3) + 2);
+}
+
+inline Move make_move(Square from, Square to) {
+ return Move(to | (from << 6));
+}
+
+inline Move make_promotion(Square from, Square to, PieceType pt) {
+ return Move(to | (from << 6) | (1 << 14) | ((pt - 2) << 12)) ;
+}
+
+inline Move make_enpassant(Square from, Square to) {
+ return Move(to | (from << 6) | (2 << 14));
+}
+
+inline Move make_castle(Square from, Square to) {
+ return Move(to | (from << 6) | (3 << 14));
+}
+
+inline bool is_ok(Move m) {
+ return from_sq(m) != to_sq(m); // Catches also MOVE_NULL and MOVE_NONE
+}
+
+#include <string>
+
+inline const std::string square_to_string(Square s) {
+ char ch[] = { file_to_char(file_of(s)), rank_to_char(rank_of(s)), 0 };
+ return ch;
+}
+
+/// Our insertion sort implementation, works with pointers and iterators and is
+/// guaranteed to be stable, as is needed.
+template<typename T, typename K>
+void sort(K first, K last)
+{
+ T tmp;
+ K p, q;
+
+ for (p = first + 1; p < last; p++)
+ {
+ tmp = *p;
+ for (q = p; q != first && *(q-1) < tmp; --q)
+ *q = *(q-1);
+ *q = tmp;
+ }