Repo created
This commit is contained in:
parent
4af19165ec
commit
68073add76
12458 changed files with 12350765 additions and 2 deletions
84
libs/routing/lanes/lane_way.hpp
Normal file
84
libs/routing/lanes/lane_way.hpp
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
#pragma once
|
||||
|
||||
#include "base/assert.hpp"
|
||||
|
||||
#include <bitset>
|
||||
#include <initializer_list>
|
||||
#include <string>
|
||||
|
||||
namespace routing::turns::lanes
|
||||
{
|
||||
enum class LaneWay : std::uint8_t
|
||||
{
|
||||
None = 0,
|
||||
ReverseLeft,
|
||||
SharpLeft,
|
||||
Left,
|
||||
MergeToLeft,
|
||||
SlightLeft,
|
||||
Through,
|
||||
SlightRight,
|
||||
MergeToRight,
|
||||
Right,
|
||||
SharpRight,
|
||||
ReverseRight,
|
||||
|
||||
Count
|
||||
};
|
||||
|
||||
class LaneWays
|
||||
{
|
||||
using LaneWaysT = std::bitset<static_cast<std::uint8_t>(LaneWay::Count)>;
|
||||
|
||||
friend std::string DebugPrint(LaneWays const & laneWays);
|
||||
|
||||
public:
|
||||
constexpr LaneWays() = default;
|
||||
constexpr LaneWays(std::initializer_list<LaneWay> const laneWays)
|
||||
{
|
||||
for (auto const & laneWay : laneWays)
|
||||
Add(laneWay);
|
||||
}
|
||||
|
||||
constexpr bool operator==(LaneWays const & rhs) const { return m_laneWays == rhs.m_laneWays; }
|
||||
|
||||
constexpr void Add(LaneWay laneWay)
|
||||
{
|
||||
ASSERT_LESS(laneWay, LaneWay::Count, ());
|
||||
m_laneWays.set(static_cast<std::uint8_t>(laneWay));
|
||||
}
|
||||
|
||||
constexpr void Remove(LaneWay laneWay)
|
||||
{
|
||||
ASSERT_LESS(laneWay, LaneWay::Count, ());
|
||||
m_laneWays.reset(static_cast<std::uint8_t>(laneWay));
|
||||
}
|
||||
|
||||
constexpr bool Contains(LaneWay laneWay) const
|
||||
{
|
||||
ASSERT_LESS(laneWay, LaneWay::Count, ());
|
||||
return m_laneWays.test(static_cast<std::uint8_t>(laneWay));
|
||||
}
|
||||
|
||||
/// An unrestricted lane is a lane that has no restrictions, i.e., it contains no lane ways.
|
||||
constexpr bool IsUnrestricted() const
|
||||
{
|
||||
return m_laneWays.none() || (m_laneWays.count() == 1 && Contains(LaneWay::None));
|
||||
}
|
||||
|
||||
[[nodiscard]] std::vector<LaneWay> GetActiveLaneWays() const
|
||||
{
|
||||
std::vector<LaneWay> result;
|
||||
for (std::size_t i = 0; i < m_laneWays.size(); ++i)
|
||||
if (m_laneWays.test(i))
|
||||
result.emplace_back(static_cast<LaneWay>(i));
|
||||
return result;
|
||||
}
|
||||
|
||||
private:
|
||||
LaneWaysT m_laneWays;
|
||||
};
|
||||
|
||||
std::string DebugPrint(LaneWay laneWay);
|
||||
std::string DebugPrint(LaneWays const & laneWays);
|
||||
} // namespace routing::turns::lanes
|
||||
Loading…
Add table
Add a link
Reference in a new issue