From d4c162c1e0c41cbba96a09d8a251731bc5085fdb Mon Sep 17 00:00:00 2001 From: "C. J. Howard" Date: Sat, 21 Nov 2020 22:11:20 +0800 Subject: [PATCH] Add initial genetics code --- src/game/genetics/allele.hpp | 38 +++++++++++++++++++ src/game/genetics/gene.hpp | 33 +++++++++++++++++ src/game/genetics/zygosity.hpp | 68 ++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/game/genetics/allele.hpp create mode 100644 src/game/genetics/gene.hpp create mode 100644 src/game/genetics/zygosity.hpp diff --git a/src/game/genetics/allele.hpp b/src/game/genetics/allele.hpp new file mode 100644 index 0000000..e39ed80 --- /dev/null +++ b/src/game/genetics/allele.hpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2020 Christopher J. Howard + * + * This file is part of Antkeeper source code. + * + * Antkeeper source code is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Antkeeper source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Antkeeper source code. If not, see . + */ + +#ifndef ANTKEEPER_ALLELE_HPP +#define ANTKEEPER_ALLELE_HPP + +namespace dna +{ + +/// Enumerates allele types. +enum class allele: bool +{ + /// Indicates an allele is recessive. + recessive = false, + + /// Indicates an allele is dominant. + dominant = true +}; + +} // namespace dna + +#endif // ANTKEEPER_ALLELE_HPP diff --git a/src/game/genetics/gene.hpp b/src/game/genetics/gene.hpp new file mode 100644 index 0000000..0de648e --- /dev/null +++ b/src/game/genetics/gene.hpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2020 Christopher J. Howard + * + * This file is part of Antkeeper source code. + * + * Antkeeper source code is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Antkeeper source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Antkeeper source code. If not, see . + */ + +#ifndef ANTKEEPER_GENE_HPP +#define ANTKEEPER_GENE_HPP + +#include "allele.hpp" + +namespace dna +{ + +/// A gene with two alleles. +typedef std::array gene; + +} // namespace dna + +#endif // ANTKEEPER_GENE_HPP diff --git a/src/game/genetics/zygosity.hpp b/src/game/genetics/zygosity.hpp new file mode 100644 index 0000000..549edca --- /dev/null +++ b/src/game/genetics/zygosity.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2020 Christopher J. Howard + * + * This file is part of Antkeeper source code. + * + * Antkeeper source code is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Antkeeper source code is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Antkeeper source code. If not, see . + */ + +#ifndef ANTKEEPER_ZYGOSITY_HPP +#define ANTKEEPER_ZYGOSITY_HPP + +#include "gene.hpp" + +namespace dna +{ + +/// A homozygous recessive gene. +static constexpr gene homozygous_recessive = {allele::recessive, allele::recessive}; + +/// A homozygous dominant gene. +static constexpr gene homozygous_dominant = {allele::recessive, allele::recessive}; + +/// Returns `true` if gene @p x is heterozygous, `false` otherwise. +bool is_heterozygous(const gene& x); + +/// Returns `true` if gene @p x is homozygous, `false` otherwise. +bool is_homozygous(const gene& x); + +/// Returns `true` if gene @p x is homozygous recessive, `false` otherwise. +bool is_homozygous_recessive(const gene& x); + +/// Returns `true` if gene @p x is homozygous dominant, `false` otherwise. +bool is_homozygous_dominant(const gene& x); + +inline bool is_heterozygous(const gene& x) +{ + return x[0] != x[1]; +} + +inline bool is_homozygous(const gene& x) +{ + return x[0] == x[1]; +} + +inline bool is_homozygous_recessive(const gene& x) +{ + return x == homozygous_recessive; +} + +inline bool is_homozygous_dominant(const gene& x) +{ + return x == homozygous_dominant; +} + +} // namespace dna + +#endif // ANTKEEPER_ZYGOSITY_HPP