Program Listing for File Phase.hpp

Return to documentation for file (/tmp/ws/src/rmf_task/rmf_task/include/rmf_task/Phase.hpp)

/*
 * Copyright (C) 2021 Open Source Robotics Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
*/

#ifndef RMF_TASK__PHASE_HPP
#define RMF_TASK__PHASE_HPP

#include <rmf_task/Event.hpp>
#include <rmf_task/Header.hpp>

#include <rmf_traffic/Time.hpp>

#include <rmf_utils/impl_ptr.hpp>

#include <memory>

namespace rmf_task {

//==============================================================================
class Phase
{
public:

  class Tag;
  using ConstTagPtr = std::shared_ptr<const Tag>;

  class Completed;
  using ConstCompletedPtr = std::shared_ptr<const Completed>;

  class Active;
  using ConstActivePtr = std::shared_ptr<const Active>;

  class Snapshot;
  using ConstSnapshotPtr = std::shared_ptr<const Snapshot>;

  class Pending;
};

//==============================================================================
class Phase::Tag
{
public:

  using Id = uint64_t;

  Tag(Id id_, Header header_);

  Id id() const;

  const Header& header() const;

  class Implementation;
private:
  rmf_utils::impl_ptr<Implementation> _pimpl;
};

//==============================================================================
class Phase::Completed
{
public:

  Completed(
    ConstSnapshotPtr snapshot_,
    rmf_traffic::Time start_,
    rmf_traffic::Time finish_);

  const ConstSnapshotPtr& snapshot() const;

  rmf_traffic::Time start_time() const;

  rmf_traffic::Time finish_time() const;

  class Implementation;
private:
  rmf_utils::impl_ptr<Implementation> _pimpl;
};

//==============================================================================
class Phase::Active
{
public:

  virtual ConstTagPtr tag() const = 0;

  virtual Event::ConstStatePtr final_event() const = 0;

  virtual rmf_traffic::Duration estimate_remaining_time() const = 0;

  // Virtual destructor
  virtual ~Active() = default;
};

//==============================================================================
class Phase::Snapshot : public Phase::Active
{
public:

  static ConstSnapshotPtr make(const Active& active);

  // Documentation inherited
  ConstTagPtr tag() const final;

  // Documentation inherited
  Event::ConstStatePtr final_event() const final;

  // Documentation inherited
  rmf_traffic::Duration estimate_remaining_time() const final;

  class Implementation;
private:
  Snapshot();
  rmf_utils::impl_ptr<Implementation> _pimpl;
};

//==============================================================================
class Phase::Pending
{
public:

  Pending(ConstTagPtr tag);

  const ConstTagPtr& tag() const;

  Pending& will_be_skipped(bool value);

  bool will_be_skipped() const;

  class Implementation;
private:
  rmf_utils::impl_ptr<Implementation> _pimpl;
};

} // namespace rmf_task

#endif // RMF_TASK__PHASE_HPP