// src/backend/dynamic_sub_request.hh - Copyright 2005, 2006, University
//               of Padova, dept. of Pure and Applied
//               Mathematics
//
// This file is part of SGPEMv2.
//
// This is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// SGPEMv2 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with SGPEMv2; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

#ifndef DYNAMIC_SUB_REQUEST_HH
#define DYNAMIC_SUB_REQUEST_HH 1

#include "config.h"

#include <sgpemv2/request.hh>
#include <sgpemv2/sub_request.hh>
#include "dynamic_request.hh"
#include "dynamic_resource.hh"
#include "static_sub_request.hh"

#include <sgpemv2/templates/smartp.hh>

namespace sgpem
{
  class DynamicSubRequest;
  class SerializeVisitor;
  class Resource;
  class StaticSubRequest;

  class SG_DLLLOCAL DynamicSubRequest : public SubRequest
  {
  public:
    DynamicSubRequest(StaticSubRequest* core,
                      DynamicRequest* owner);
    DynamicSubRequest(const DynamicSubRequest& other, DynamicRequest* owner);

    virtual ~DynamicSubRequest();

    virtual bool operator==(const SubRequest& op2) const;

    resource_key_t get_resource_key() const;

    unsigned int get_length() const;

    int get_queue_position() const;
    void set_queue_position(int position);

    virtual DynamicRequest& get_request();

    state get_state() const;
    state set_state(state new_state);

    unsigned int get_remaining_time() const;
    unsigned int decrease_remaining_time();

    void serialize(SerializeVisitor& translator) const;

    StaticSubRequest& get_core();
    const StaticSubRequest& get_core() const;

  private:
    // Undefined
    DynamicSubRequest(const DynamicSubRequest&);

    memory::smart_ptr<StaticSubRequest> _static_subrequest;
    DynamicRequest*  _owner;
    int              _queue_position;
    unsigned int     _ran_for;
    state            _state;
  };

}

#endif
