diff --git a/src/game/genetics/zygosity.hpp b/src/game/genetics/zygosity.hpp index b67bcce..450dada 100644 --- a/src/game/genetics/zygosity.hpp +++ b/src/game/genetics/zygosity.hpp @@ -20,47 +20,37 @@ #ifndef ANTKEEPER_ZYGOSITY_HPP #define ANTKEEPER_ZYGOSITY_HPP -#include "gene.hpp" - namespace dna { - -/// A homozygous recessive gene. -static constexpr gene homozygous_recessive = 0b00; - -/// A homozygous dominant gene. -static constexpr gene homozygous_dominant = 0b11; -/// Returns `true` if gene @p x is heterozygous, `false` otherwise. -bool is_heterozygous(gene x); - -/// Returns `true` if gene @p x is homozygous, `false` otherwise. -bool is_homozygous(gene x); - -/// Returns `true` if gene @p x is homozygous recessive, `false` otherwise. -bool is_homozygous_recessive(gene x); - -/// Returns `true` if gene @p x is homozygous dominant, `false` otherwise. -bool is_homozygous_dominant(gene x); - -inline bool is_heterozygous(gene x) -{ - return x - 1 < 2; -} +/** + * Tests a gene for heterozygosity. + * + * @param x Gene with alleles encoded in the two least significant bits. + * @return `true` if the gene is heterozygous, `false` otherwise. + */ +template +bool is_heterozygous(T x); -inline bool is_homozygous(gene x) -{ - return (x & 1) == (x >> 1); -} +/** + * Tests a gene for homozygosity. + * + * @param x Gene with alleles encoded in the two least significant bits. + * @return `true` if the gene is homozygous, `false` otherwise. + */ +template +bool is_homozygous(T x); -inline bool is_homozygous_recessive(gene x) +template +inline bool is_heterozygous(T x) { - return x == homozygous_recessive; + return x & 1 != (x >> 1) & 1; } -inline bool is_homozygous_dominant(gene x) +template +inline bool is_homozygous(T x) { - return x == homozygous_dominant; + return x & 1 == (x >> 1) & 1; } } // namespace dna