newmen/versatile-diamond

View on GitHub
engine/cpp/mc/events/base_events_container.h

Summary

Maintainability
Test Coverage
#ifndef BASE_EVENTS_CONTAINER_H
#define BASE_EVENTS_CONTAINER_H

#include <vector>
#include <unordered_map>
#include "../../reactions/reaction.h"

namespace vd
{

class BaseEventsContainer
{
protected:
    std::vector<Reaction *> _events;

public:
    virtual ~BaseEventsContainer() {}

    Reaction *selectEvent(double r);

#ifdef JSONLOG
    std::string name() const { return _events.front()->name(); }
#endif // JSONLOG
    double oneRate() const;
    double commonRate() const;

#if defined(PRINT) || defined(MC_PRINT) || defined(JSONLOG) || !defined(NDEBUG)
    uint size() const { return _events.size(); }
#endif // PRINT || MC_PRINT || JSONLOG || !NDEBUG

protected:
    BaseEventsContainer() = default;

    template <class R> R *exchangeToLast(uint index);

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

//////////////////////////////////////////////////////////////////////////////////////

template <class R>
R *BaseEventsContainer::exchangeToLast(uint index)
{
    assert(index < _events.size());

    Reaction *last = _events.back();
    _events.pop_back();

    if (_events.cbegin() + index != _events.cend())
    {
        _events[index] = last;
        return static_cast<R *>(last);
    }
    return nullptr;
}

}

#endif // BASE_EVENTS_CONTAINER_H