Program Listing for File Database.hpp

Return to documentation for file (/tmp/ws/src/rmf_traffic/rmf_traffic/include/rmf_traffic/schedule/Database.hpp)

/*
 * Copyright (C) 2019 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_TRAFFIC__SCHEDULE__DATABASE_HPP
#define RMF_TRAFFIC__SCHEDULE__DATABASE_HPP

#include <rmf_traffic/schedule/Inconsistencies.hpp>
#include <rmf_traffic/schedule/Viewer.hpp>
#include <rmf_traffic/schedule/Patch.hpp>
#include <rmf_traffic/schedule/Writer.hpp>
#include <rmf_traffic/schedule/Snapshot.hpp>

#include <rmf_utils/macros.hpp>

namespace rmf_traffic {
namespace schedule {

//==============================================================================
class Database : public ItineraryViewer, public Writer, public Snappable
{
public:

  //============================================================================
  // Writer API
  //============================================================================

  // Documentation inherited from Writer
  void set(
    ParticipantId participant,
    PlanId plan,
    const Itinerary& itinerary,
    StorageId storage_base,
    ItineraryVersion version) final;

  // Documentation inherited from Writer
  void extend(
    ParticipantId participant,
    const Itinerary& routes,
    ItineraryVersion version) final;

  // Documentation inherited from Writer
  void delay(
    ParticipantId participant,
    Duration delay,
    ItineraryVersion version) final;

  // Documentation inherited from Writer
  void reached(
    ParticipantId participant,
    PlanId plan,
    const std::vector<CheckpointId>& reached_checkpoints,
    ProgressVersion version) final;

  // Documentation inherited from Writer
  void clear(
    ParticipantId participant,
    ItineraryVersion version) final;

  // Documentation inherited from Writer
  Registration register_participant(
    ParticipantDescription participant_info) final;

  // Documentation inherited
  void update_description(
    ParticipantId participant,
    ParticipantDescription desc) final;

  void unregister_participant(
    ParticipantId participant) final;


  //============================================================================
  // Viewer API
  //============================================================================

  // Documentation inherited from Viewer
  View query(const Query& parameters) const final;

  // Documentation inherited from Viewer
  View query(
    const Query::Spacetime& spacetime,
    const Query::Participants& participants) const final;

  // Documentation inherited from Viewer
  const std::unordered_set<ParticipantId>& participant_ids() const final;

  // Documentation inherited from Viewer
  std::shared_ptr<const ParticipantDescription> get_participant(
    std::size_t participant_id) const final;

  // Documentation inherited from Viewer
  Version latest_version() const;


  //============================================================================
  // ItineraryViewer API
  //============================================================================

  // Documentation inherited from ItineraryViewer
  std::optional<ItineraryView> get_itinerary(
    std::size_t participant_id) const final;

  // Documentation inherited from ItineraryViewer
  std::optional<PlanId> get_current_plan_id(
    std::size_t participant_id) const final;

  // Documentation inherited from ItineraryViewer
  const std::vector<CheckpointId>* get_current_progress(
    ParticipantId participant_id) const final;

  // Documentation inherited from ItineraryViewer
  ProgressVersion get_current_progress_version(
    ParticipantId participant_id) const final;

  // Documentation inherited from ItineraryViewer
  DependencySubscription watch_dependency(
    Dependency dependency,
    std::function<void()> on_reached,
    std::function<void()> on_deprecated) const final;


  //============================================================================
  // Snappable API
  //============================================================================

  // Documentation inherited from Snappable
  std::shared_ptr<const Snapshot> snapshot() const final;

  //============================================================================
  // Database API
  //============================================================================

  Database();

  const Inconsistencies& inconsistencies() const;

  Patch changes(
    const Query& parameters,
    std::optional<Version> after) const;

  View query(
    const Query& parameters,
    Version after) const;

  void set_maximum_cumulative_delay(rmf_traffic::Duration maximum_delay);

  std::optional<rmf_traffic::Duration> get_cumulative_delay(
    ParticipantId participant) const;

  Version cull(Time time);

  void set_current_time(Time time);

  //
  // TODO(MXG): This function needs unit testing
  ItineraryVersion itinerary_version(ParticipantId participant) const;

  PlanId latest_plan_id(ParticipantId participant) const;

  StorageId next_storage_base(ParticipantId participant) const;

  class Implementation;
  class Debug;
private:
  rmf_utils::unique_impl_ptr<Implementation> _pimpl;
};

} // namespace schedule

} // namespace rmf_traffic

#endif // RMF_TRAFFIC__SCHEDULE__DATABASE_HPP