diff --git a/include/zipr_mem_space.h b/include/zipr_mem_space.h index ccc70966af97b434bacc5e572ea12c6205d7f647..8e46e41a189dd62b95b70a60503bb21cbedee9e8 100644 --- a/include/zipr_mem_space.h +++ b/include/zipr_mem_space.h @@ -51,6 +51,7 @@ class ZiprMemorySpace_t : public MemorySpace_t void MergeFreeRange(RangeAddress_t addr); RangeSet_t::iterator FindFreeRange(RangeAddress_t addr); Range_t GetFreeRange(int size); + std::list<Range_t> GetFreeRanges(size_t size = 0); std::pair<RangeSet_t::const_iterator,RangeSet_t::const_iterator> GetNearbyFreeRanges(const RangeAddress_t hint, size_t count = 0); void AddFreeRange(Range_t newRange); @@ -105,6 +106,7 @@ class ZiprMemorySpace_t : public MemorySpace_t RangeAddress_t max_plopped; RangeAddress_t min_plopped; ZiprBooleanOption_t m_verbose; + static bool SortRangeBySize(const Range_t &a, const Range_t &b); }; #endif diff --git a/src/memory_space.cpp b/src/memory_space.cpp index 4788d3ca57b3a8255768bdb3819fb538da051a67..1d8f831ad657521dbf65b0d0621e29b880388a9a 100644 --- a/src/memory_space.cpp +++ b/src/memory_space.cpp @@ -197,6 +197,26 @@ Range_t ZiprMemorySpace_t::GetLargeRange(void) return Range_t(0,0); } +bool ZiprMemorySpace_t::SortRangeBySize(const Range_t &a, const Range_t &b) +{ + return (a.GetEnd() - a.GetStart()) <= (b.GetEnd() - b.GetStart()); +} + +std::list<Range_t> ZiprMemorySpace_t::GetFreeRanges(size_t size) +{ + list<Range_t> result; + for( RangeSet_t::iterator it=free_ranges.begin(); + it!=free_ranges.end(); + ++it) + { + Range_t r=*it; + if(r.GetEnd() - r.GetStart() >= (unsigned) size) + result.push_back(r); + } + result.sort(SortRangeBySize); + return result; +} + Range_t ZiprMemorySpace_t::GetFreeRange(int size) { vector<Range_t> v;