#pragma once namespace WaypointManager { namespace Utils { template CoordinateType getCoordinate(const SimpleMissionItem* item){ return item->coordinate(); } template<> QVariant getCoordinate(const SimpleMissionItem* item); /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> bool extract(QmlObjectListModel &missionItems, ContainerType &coordinateList, std::size_t startIndex, std::size_t endIndex) { if ( startIndex < std::size_t(missionItems.count()) && endIndex < std::size_t(missionItems.count()) && missionItems.count() > 0) { if (startIndex > endIndex) { if ( !extract(missionItems, coordinateList, startIndex, std::size_t(missionItems.count()-1)) /*recursion*/) return false; if ( !extract(missionItems, coordinateList, 0, endIndex) /*recursion*/) return false; } else { for (std::size_t i = startIndex; i <= endIndex; ++i) { SimpleMissionItem *mItem = missionItems.value(int(i)); if (mItem == nullptr) { coordinateList.clear(); return false; } coordinateList.append(getCoordinate(mItem)); } } } else return false; return true; } /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> bool extract(QmlObjectListModel &missionItems, ContainerType &coordinateList) { return extract(missionItems, coordinateList, std::size_t(0), std::size_t(missionItems.count()) ); } /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> bool extract(ContainerType &source, ContainerType &destination, std::size_t startIndex, std::size_t endIndex) { if ( startIndex < std::size_t(source.size()) && endIndex < std::size_t(source.size()) && source.size() > 0) { if (startIndex > endIndex) { if ( !extract(source, destination, startIndex, std::size_t(source.size()-1)) /*recursion*/) return false; if ( !extract(source, destination, 0, endIndex) /*recursion*/) return false; } else { for (std::size_t i = startIndex; i <= endIndex; ++i) { destination.append(source[i]); } } } else return false; return true; } } // namespace WaypointManager } // namespace WaypointManager