overmap *overmapbuffer::get_existing(int x, int y) { if( last_requested_overmap != NULL && last_requested_overmap->pos().x == x && last_requested_overmap->pos().y == y ) { return last_requested_overmap; } auto it = overmaps.find( point( x, y ) ); if( it != overmaps.end() ) { return last_requested_overmap = it->second.get(); } if (known_non_existing.count(point(x, y)) > 0) { // This overmap does not exist on disk (this has already been // checked in a previous call of this function). return NULL; } // Check if the overmap exist on disk, std::ifstream tmp(terrain_filename( x, y ).c_str(), std::ios::in); if(tmp.is_open()) { // File exists, load it normally (the get function // indirectly call overmap::open to do so). tmp.close(); return &get( x, y ); } // File does not exist (or not readable which is essentially // the same for our usage). A second call of this function with // the same coordinates will not check the file system, and // return early. // If the overmap had been created in the mean time, the previous // loop would have found and returned it. known_non_existing.insert(point(x, y)); return NULL; }
overmap *overmapbuffer::get_existing( int x, int y ) { const point p {x, y}; if( last_requested_overmap && last_requested_overmap->pos() == p ) { return last_requested_overmap; } const auto it = overmaps.find( p ); if( it != overmaps.end() ) { return last_requested_overmap = it->second.get(); } if( known_non_existing.count( p ) > 0 ) { // This overmap does not exist on disk (this has already been // checked in a previous call of this function). return nullptr; } if( file_exist( terrain_filename( x, y ) ) ) { // File exists, load it normally (the get function // indirectly call overmap::open to do so). return &get( x, y ); } // File does not exist (or not readable which is essentially // the same for our usage). A second call of this function with // the same coordinates will not check the file system, and // return early. // If the overmap had been created in the mean time, the previous // loop would have found and returned it. known_non_existing.insert( p ); return nullptr; }