text: /*****************************************************************************************
   *                                                                                       *
   * Copyright (c) 2016 - 2020                                                             *
   * Alexander Bock, Erik Sunden, Emil Axelsson                                            *
   *                                                                                       *
   * All rights reserved.                                                                  *
   *                                                                                       *
   * Redistribution and use in source and binary forms, with or without modification, are  *
   * permitted provided that the following conditions are met:                             *
   *                                                                                       *
   * 1. Redistributions of source code must retain the above copyright notice, this list   *
   *    of conditions and the following disclaimer.                                        *
   *                                                                                       *
   * 2. Redistributions in binary form must reproduce the above copyright notice, this     *
   *    list of conditions and the following disclaimer in the documentation and/or other  *
   *    materials provided with the distribution.                                          *
   *                                                                                       *
   * 3. Neither the name of the copyright holder nor the names of its contributors may be  *
   *    used to endorse or promote products derived from this software without specific    *
   *    prior written permission.                                                          *
   *                                                                                       *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY   *
   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  *
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT   *
   * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,        *
   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED  *
   * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR    *
   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN      *
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN    *
   * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *
   * DAMAGE.                                                                               *
   *                                                                                       *
   ****************************************************************************************/
  
  #ifndef __CORE__PROCESS_H__
  #define __CORE__PROCESS_H__
  
  #include "exitcommandmessage.h"
  #include "node.h"
  #include "processstatusmessage.h"
  #include "program.h"
  #include "startcommandmessage.h"
  #include "typedid.h"
  
  struct Process {
      using ID = TypedId<int, struct ProcessIdTag>;
  
      Process(Program::ID programId, Program::Configuration::ID configurationId,
          Cluster::ID clusterId, Node::ID NodeId);
  
      // Explicitely setting the ID;  only use this constructor if you are absolutely sure
      // what you are doing as the process id is used as a unique identifier
      Process(ID id, Program::ID programId, Program::Configuration::ID configurationId,
          Cluster::ID clusterId, Node::ID NodeId);
  
      const ID id;
      const Program::ID programId;
      const Program::Configuration::ID configurationId;
      const Cluster::ID clusterId;
      const Node::ID nodeId;
      common::ProcessStatusMessage::Status status;
  
      static void setNextIdIfHigher(int id);
  
  private:
      static int nextId;
  };
  
  common::StartCommandMessage startProcessCommand(const Process& process);
  common::ExitCommandMessage exitProcessCommand(const Process& process);
  
  
  #endif // __CORE__PROCESS_H__
  