## File: pathfield.h

package info (click to toggle)
widelands 1:19+repack-3
 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 /* * Copyright (C) 2008-2010 by the Widelands Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WL_LOGIC_PATHFIELD_H #define WL_LOGIC_PATHFIELD_H #include #include #include #include #include "logic/cookie_priority_queue.h" namespace Widelands { /** * Used in pathfinding. For better encapsulation, pathfinding structures * are separate from normal fields * * Costs are in milliseconds to walk. * * Note: member sizes chosen so that we get a 16byte (=nicely aligned) * structure */ struct Pathfield { struct LessCost { bool operator()(const Pathfield& a, const Pathfield& b) const { return a.cost() < b.cost(); } }; using Queue = CookiePriorityQueue; Queue::Cookie heap_cookie; int32_t real_cost; // true cost up to this field int32_t estim_cost; // estimated cost till goal uint16_t cycle; uint8_t backlink; // how we got here (WALK_*) int32_t cost() const { return real_cost + estim_cost; } Queue::Cookie& cookie() { return heap_cookie; } }; struct Pathfields { std::unique_ptr fields; uint16_t cycle; Pathfields(uint32_t nrfields); }; /** * Efficiently manages \ref Pathfields instances. * * This allows the use of more than one such structure at once, * which is required for pathfinding reentrancy. */ struct PathfieldManager { PathfieldManager(); void set_size(uint32_t nrfields); boost::shared_ptr allocate(); private: void clear(const boost::shared_ptr& pf); using List = std::vector>; uint32_t nrfields_; List list_; }; } #endif // end of include guard: WL_LOGIC_PATHFIELD_H