newmen/versatile-diamond

View on GitHub
engine/cpp/phases/crystal.h

Summary

Maintainability
Test Coverage
#ifndef CRYSTAL_H
#define CRYSTAL_H

#include "../tools/common.h"
#include "templated_crystal.h"
#include "smart_atoms_vector3d.h"

namespace vd
{

class Atom;

class Crystal : public TemplatedCrystal<SmartAtomsVector3d, Atom>
{
public:
    void initialize();

    void changeBehavior(const Behavior *behavior);

    void insert(Atom *atom, const int3 &coords);
    void erase(Atom *atom);

    Atom *atom(const int3 &coords)
    {
        return coords.z < 0 ? nullptr : atoms()[coords];
    }

protected:
    Crystal(const dim3 &sizes, const Behavior *behavior);

    virtual void buildAtoms() = 0;
    virtual void bondAllAtoms() = 0;
    virtual void detectAtomTypes() = 0;
    virtual void findAll() = 0;

    virtual Atom *makeAtom(ushort type, ushort actives, const int3 &coords) = 0;

    void makeLayer(uint z, ushort type, ushort actives);
    virtual bool hasBottom(const int3 &coords) = 0;
};

}

#endif // CRYSTAL_H