feat(MaskedComposition): added MaskedComposition to libcomposition

MaskedComposition is a generally useful decorator, therefore instead of forcing callers to impliment it on their own, we have implimented it as part of libcomposition
This commit is contained in:
2025-11-10 08:47:35 -05:00
parent 71e9269837
commit 2492b5f652
8 changed files with 343 additions and 77 deletions

View File

@@ -8,7 +8,7 @@
#include "fourdst/composition/composition.h"
#include "fourdst/composition/exceptions/exceptions_composition.h"
#include "fourdst/composition/utils.h"
#include "fourdst/composition/composition_abstract.h"
#include "fourdst/composition/decorators/composition_masked.h"
#include "fourdst/config/config.h"
@@ -236,41 +236,18 @@ TEST_F(compositionTest, buildFromMassFractions) {
}
/**
* @brief Tests inheritance from CompositionAbstract and overriding a getter.
* @details This test defines a derived class that overrides getMolarAbundance,
* and verifies that the override works and other getters are inherited.
* @par What this test proves:
* - Derived classes can override getters.
* - All CompositionAbstract children have the standard getter interface.
*/
TEST_F(compositionTest, abstractBase) {
class UnrestrictedComposition : public fourdst::composition::CompositionDecorator {
public:
UnrestrictedComposition(std::unique_ptr<CompositionAbstract> base, const fourdst::atomic::Species& species):
CompositionDecorator(std::move(base)),
m_species(species)
{}
double getMolarAbundance(const fourdst::atomic::Species &species) const override {
if (species == m_species) {
return 1.0;
}
return CompositionDecorator::getMolarAbundance(species);
}
private:
fourdst::atomic::Species m_species;
};
TEST_F(compositionTest, decorators) {
fourdst::composition::Composition comp;
comp.registerSymbol("H-1"); comp.registerSymbol("He-4"); comp.registerSymbol("O-16");
comp.setMolarAbundance("H-1", 0.6); comp.setMolarAbundance("He-4", 0.6);
const fourdst::composition::MaskedComposition mComp(comp, {fourdst::atomic::H_1, fourdst::atomic::He_4});
ASSERT_DOUBLE_EQ(mComp.getMolarAbundance(fourdst::atomic::H_1), 0.6);
ASSERT_DOUBLE_EQ(mComp.getMolarAbundance("He-4"), 0.6);
ASSERT_FALSE(mComp.contains("O-16"));
comp.setMolarAbundance("H-1", 1.0);
ASSERT_NE(mComp.getMolarAbundance(fourdst::atomic::H_1), 1.0);
const UnrestrictedComposition uComp(std::make_unique<fourdst::composition::Composition>(comp), fourdst::atomic::H_1);
ASSERT_DOUBLE_EQ(uComp.getMolarAbundance(fourdst::atomic::H_1), 1.0);
ASSERT_DOUBLE_EQ(uComp.getMassFraction("He-4"), comp.getMassFraction("He-4"));
}