newmen/versatile-diamond

View on GitHub
engine/cpp/mc/base_mc.h

Summary

Maintainability
Test Coverage
#ifndef BASE_MC_H
#define BASE_MC_H

#include <limits>
#include "../reactions/spec_reaction.h"
#include "../reactions/ubiquitous_reaction.h"
#include "base_mc_data.h"

#define DISABLE_MC_SORT false

namespace vd
{

class BaseMC
{
    double _totalTime = 0.0;

public:
    virtual ~BaseMC() {}

    double totalTime() const { return _totalTime; }
    void initCounter(BaseMCData *data) const;

    virtual void sort() = 0;
    virtual void halfSort() = 0;

    double doRandom(BaseMCData *data);
    virtual double totalRate() const  = 0;

    virtual void add(ushort index, SpecReaction *reaction) = 0;
    virtual void remove(ushort index, SpecReaction *reaction) = 0;

    virtual void add(ushort index, UbiquitousReaction *reaction, ushort n) = 0;
    virtual void remove(ushort index, UbiquitousReaction *reaction, ushort n) = 0;
    virtual void removeAll(ushort index, UbiquitousReaction *reaction) = 0;
    virtual bool check(ushort index, Atom *target) = 0;

#ifndef NDEBUG
    virtual void doOneOfOne(ushort rt) = 0;
    virtual void doLastOfOne(ushort rt) = 0;

    virtual void doOneOfMul(ushort rt) = 0;
    virtual void doOneOfMul(ushort rt, int x, int y, int z) = 0;
    virtual void doLastOfMul(ushort rt) = 0;
#endif // NDEBUG

protected:
    BaseMC() = default;

    virtual uint totalEventsNum() const = 0;
    virtual Reaction *mostProbablyEvent(double r) = 0;
    virtual void recountTotalRate() = 0;

    double increaseTime(BaseMCData *data);

#if defined(PRINT) || defined(MC_PRINT)
    void printReaction(Reaction *reaction, std::string action, std::string type, uint n = 1);
#endif // PRINT || MC_PRINT

private:
    BaseMC(const BaseMC &) = delete;
    BaseMC(BaseMC &&) = delete;
    BaseMC &operator = (const BaseMC &) = delete;
    BaseMC &operator = (BaseMC &&) = delete;
};

}

#endif // BASE_MC_H