/*
 * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
 *
 * This software is distributed under the terms of the GNU General Public
 * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
 * the license.
 */

#pragma once

#include <corsika/process/BaseProcess.h>
#include <corsika/process/ProcessReturn.h> // for convenience
#include <corsika/units/PhysicalUnits.h>

namespace corsika::process {

  /**
     \class ContinuousProcess

     The structural base type of a process object in a
     ProcessSequence. Both, the ProcessSequence and all its elements
     are of type ContinuousProcess<T>

   */

  template <typename TDerived>
<<<<<<< HEAD
  class ContinuousProcess : public BaseProcess<TDerived> {
=======
  class ContinuousProcess {
>>>>>>> renamed base process templates
  private:
  protected:
  public:
    using _TDerived = TDerived;
<<<<<<< HEAD
=======

    TDerived& GetRef() { return static_cast<TDerived&>(*this); }
    const TDerived& GetRef() const { return static_cast<const TDerived&>(*this); }
>>>>>>> renamed base process templates

    // here starts the interface part
    // -> enforce TDerived to implement DoContinuous...
    template <typename TParticle, typename TTrack>
    EProcessReturn DoContinuous(TParticle&, TTrack const&) const;

    // -> enforce TDerived to implement MaxStepLength...
    template <typename TParticle, typename TTrack>
    units::si::LengthType MaxStepLength(TParticle const& p, TTrack const& track) const;
  };

} // namespace corsika::process