using System;
using System.Collections.Generic;
using MultiWheelC.TrajectoryPlanning.Utils;
namespace MultiWheelC.TrajectoryPlanning.Mapping;
/// 规划地图创建的终止状态。
public enum PlanningMapBuildStatus
{
/// 已成功创建可用的不可变地图快照。
Success,
/// 输入、来源或地图构建失败。
Failed,
/// 调用方在地图创建期间取消了操作。
Cancelled,
/// 地图创建消耗了整次规划操作的总超时预算。
TimedOut,
}
/// 本次地图创建使用的缓存层级,反映快照或占据数组的复用方式。
public enum PlanningMapCacheHit
{
/// 未命中缓存;本次重新创建了占据图和距离场。
None,
/// 完整输入命中;返回与上次完全相同的不可变地图对象。
Input,
/// 占据内容命中;复用占据和距离数组,但生成新的快照元数据。
Occupancy,
}
///
/// 规划地图创建的最终结果。
///
/// 返回:
/// - Succeeded 为 true 时 Map 可用;false 时通过 FailureReason 获取原因。
/// - SourceResults 始终保留已处理来源的投影状态,便于诊断。
///
public sealed class PlanningMapBuildResult
{
private PlanningMapBuildResult(PlanningMapBuildStatus status, string failureReason, IReadOnlyList sourceResults, PlanningMapCacheHit cacheHit, PlanningGridMap map)
{
Status = status; FailureReason = failureReason ?? string.Empty; SourceResults = sourceResults ?? Array.Empty(); CacheHit = cacheHit; Map = map;
}
/// 本次建图的显式终止状态;取消和超时不提供地图快照。
public PlanningMapBuildStatus Status { get; }
/// 本次建图是否成功。true 表示 Status 为 Success 且 Map 不为空;false 时读取 FailureReason。
public bool Succeeded { get { return Status == PlanningMapBuildStatus.Success; } }
/// 建图失败的可读诊断。成功时为空字符串。
public string FailureReason { get; }
/// 每个障碍物来源的投影结果,按建图器排序后的来源顺序排列。
public IReadOnlyList SourceResults { get; }
/// 本次调用的缓存复用层级,用于性能诊断,不影响地图正确性。
public PlanningMapCacheHit CacheHit { get; }
/// 成功时返回的不可变规划地图;失败时为 null。
public PlanningGridMap Map { get; }
internal static PlanningMapBuildResult Success(PlanningGridMap map, IReadOnlyList sourceResults, PlanningMapCacheHit cacheHit) { return new PlanningMapBuildResult(PlanningMapBuildStatus.Success, null, sourceResults, cacheHit, map); }
internal static PlanningMapBuildResult Failure(string reason, IReadOnlyList sourceResults) { return new PlanningMapBuildResult(PlanningMapBuildStatus.Failed, reason, sourceResults, PlanningMapCacheHit.None, null); }
internal static PlanningMapBuildResult Stopped(PlanningOperationStopReason stopReason, IReadOnlyList sourceResults)
{
if (stopReason == PlanningOperationStopReason.Cancelled)
return new PlanningMapBuildResult(PlanningMapBuildStatus.Cancelled, "地图创建已取消。", sourceResults, PlanningMapCacheHit.None, null);
if (stopReason == PlanningOperationStopReason.TimedOut)
return new PlanningMapBuildResult(PlanningMapBuildStatus.TimedOut, "地图创建已超时。", sourceResults, PlanningMapCacheHit.None, null);
throw new ArgumentOutOfRangeException(nameof(stopReason));
}
}