Program Listing for File Mirror.hpp

Return to documentation for file (/tmp/ws/src/rmf_traffic/rmf_traffic/include/rmf_traffic/schedule/Mirror.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__MIRROR_HPP
#define RMF_TRAFFIC__SCHEDULE__MIRROR_HPP

#include <rmf_traffic/schedule/Database.hpp>

namespace rmf_traffic {
namespace schedule {

//==============================================================================
class Mirror : public ItineraryViewer, public Snappable
{
public:

  //============================================================================
  // 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
  std::optional<ItineraryView> get_itinerary(
    std::size_t participant_id) const final;

  // Documentation inherited from Viewer
  std::optional<Version> latest_version() const;


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

  // Documentation inherited from ItineraryViewer
  std::optional<PlanId> get_current_plan_id(
    ParticipantId 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
  //============================================================================
  std::shared_ptr<const Snapshot> snapshot() const final;


  //============================================================================
  // Mirror API
  //============================================================================

  Mirror();

  void update_participants_info(const ParticipantDescriptionsMap& participants);

  bool update(const Patch& patch);

  void reset();

  Database fork() const;

  // TODO(MXG): Consider a feature to log and report any possible
  // inconsistencies that might show up with the patches, e.g. replacing or
  // erasing a trajectory that was never received in the first place.

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


} // namespace schedule
} // namepsace rmf_traffic

#endif // RMF_TRAFFIC__SCHEDULE__MIRROR_HPP