Program Listing for File Inconsistencies.hpp

Return to documentation for file (include/rmf_traffic/schedule/Inconsistencies.hpp)

/*
 * Copyright (C) 2020 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__INCONSISTENCY_HPP
#define RMF_TRAFFIC__SCHEDULE__INCONSISTENCY_HPP

#include <rmf_utils/impl_ptr.hpp>

#include <rmf_traffic/detail/forward_iterator.hpp>
#include <rmf_traffic/schedule/Itinerary.hpp>
#include <rmf_traffic/schedule/Participant.hpp>

namespace rmf_traffic {
namespace schedule {

class Database;

//============================================================================
class Inconsistencies
{
public:

  template<typename E, typename I, typename F>
  using base_iter = rmf_traffic::detail::forward_iterator<E, I, F>;

  class Ranges
  {
  public:

    struct Range
    {
      ItineraryVersion lower;
      ItineraryVersion upper;
    };

    class IterImpl;
    using const_iterator = base_iter<const Range, IterImpl, Ranges>;

    const_iterator begin() const;

    const_iterator cbegin() const;

    const_iterator end() const;

    const_iterator cend() const;

    std::size_t size() const;

    ItineraryVersion last_known_version() const;

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

  // TODO(MXG): Consider pimplfying this class
  struct Element
  {
    ParticipantId participant;
    Ranges ranges;
  };

  class IterImpl;
  using const_iterator = base_iter<const Element, IterImpl, Inconsistencies>;

  const_iterator begin() const;

  const_iterator cbegin() const;

  const_iterator end() const;

  const_iterator cend() const;

  const_iterator find(ParticipantId id) const;

  std::size_t size() const;

  class Implementation;
private:
  friend class Database;
  Inconsistencies();
  rmf_utils::unique_impl_ptr<Implementation> _pimpl;
};


} // namespace schedule

namespace detail {

//==============================================================================
extern template class forward_iterator<
    const schedule::Inconsistencies::Ranges::Range,
    schedule::Inconsistencies::Ranges::IterImpl,
    schedule::Inconsistencies::Ranges
>;

//==============================================================================
extern template class forward_iterator<
    const schedule::Inconsistencies::Element,
    schedule::Inconsistencies::IterImpl,
    schedule::Inconsistencies
>;

} // namespace detail

} // namespace rmf_traffic

#endif // RMF_TRAFFIC__SCHEDULE__INCONSISTENCY_HPP