mirror of https://github.com/CGAL/cgal
Merged feature-branche Compact_container_reserve-gdamiand into next (test suite is ok, Laurent is ok)
This commit is contained in:
commit
18e674fc14
|
|
@ -210,6 +210,12 @@
|
||||||
{swaps the contents of \ccVar\ and \ccStyle{cc} in constant time
|
{swaps the contents of \ccVar\ and \ccStyle{cc} in constant time
|
||||||
complexity. No exception is thrown.}
|
complexity. No exception is thrown.}
|
||||||
|
|
||||||
|
\ccMethod{void reserve(size_type value);}
|
||||||
|
{if \ccc{value} is less than or equal to \ccc{capacity()}, this call
|
||||||
|
has no effect. Otherwise, it is a request for allocation of
|
||||||
|
additional memory so that then \ccc{capacity()} is greater than or
|
||||||
|
equal to value. \ccc{size()} is unchanged.}
|
||||||
|
|
||||||
%% +-----------------------------------+
|
%% +-----------------------------------+
|
||||||
\ccHeading{Access Member Functions}
|
\ccHeading{Access Member Functions}
|
||||||
|
|
||||||
|
|
@ -254,7 +260,6 @@
|
||||||
{returns the total number of elements that~\ccVar\ can hold without requiring
|
{returns the total number of elements that~\ccVar\ can hold without requiring
|
||||||
reallocation.}
|
reallocation.}
|
||||||
|
|
||||||
% - reserve() % XXX FIXME
|
|
||||||
% - block_size() % TODO
|
% - block_size() % TODO
|
||||||
|
|
||||||
\ccMethod{Allocator get_allocator() const;}{returns the allocator.}
|
\ccMethod{Allocator get_allocator() const;}{returns the allocator.}
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
// a free/used/boundary element.
|
// a free/used/boundary element.
|
||||||
|
|
||||||
// TODO :
|
// TODO :
|
||||||
// - Add .reserve() and .resize() (and proper copy of capacity_).
|
// - Add .resize() (and proper copy of capacity_).
|
||||||
// - Add preconditions in input that real pointers need to have clean bits.
|
// - Add preconditions in input that real pointers need to have clean bits.
|
||||||
// Also for the allocated memory alignment, and sizeof().
|
// Also for the allocated memory alignment, and sizeof().
|
||||||
// - Do a benchmark before/after.
|
// - Do a benchmark before/after.
|
||||||
|
|
@ -82,6 +82,9 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
#define CGAL_INIT_BLOCK_SIZE 14
|
||||||
|
#define CGAL_INCREMENT_BLOCK_SIZE 16
|
||||||
|
|
||||||
// The following base class can be used to easily add a squattable pointer
|
// The following base class can be used to easily add a squattable pointer
|
||||||
// to a class (maybe you loose a bit of compactness though).
|
// to a class (maybe you loose a bit of compactness though).
|
||||||
// TODO : Shouldn't adding these bits be done automatically and transparently,
|
// TODO : Shouldn't adding these bits be done automatically and transparently,
|
||||||
|
|
@ -437,8 +440,6 @@ public:
|
||||||
return capacity_;
|
return capacity_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reserve(size_type n); // TODO
|
|
||||||
|
|
||||||
// void resize(size_type sz, T c = T()); // TODO makes sense ???
|
// void resize(size_type sz, T c = T()); // TODO makes sense ???
|
||||||
|
|
||||||
bool empty() const
|
bool empty() const
|
||||||
|
|
@ -488,6 +489,18 @@ public:
|
||||||
return cit != end() && owns(cit);
|
return cit != end() && owns(cit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Reserve method to ensure that the capacity of the Compact_container be
|
||||||
|
* greater or equal than a given value n.
|
||||||
|
*/
|
||||||
|
void reserve(size_type n)
|
||||||
|
{
|
||||||
|
if ( capacity_>=n ) return;
|
||||||
|
size_type tmp = block_size;
|
||||||
|
block_size = std::max( n - capacity_, block_size );
|
||||||
|
allocate_new_block();
|
||||||
|
block_size = tmp+CGAL_INCREMENT_BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void allocate_new_block();
|
void allocate_new_block();
|
||||||
|
|
@ -552,7 +565,7 @@ private:
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
block_size = 14;
|
block_size = CGAL_INIT_BLOCK_SIZE;
|
||||||
capacity_ = 0;
|
capacity_ = 0;
|
||||||
size_ = 0;
|
size_ = 0;
|
||||||
free_list = NULL;
|
free_list = NULL;
|
||||||
|
|
@ -649,7 +662,7 @@ void Compact_container<T, Allocator>::allocate_new_block()
|
||||||
}
|
}
|
||||||
set_type(last_item, NULL, START_END);
|
set_type(last_item, NULL, START_END);
|
||||||
// Increase the block_size for the next time.
|
// Increase the block_size for the next time.
|
||||||
block_size += 16;
|
block_size += CGAL_INCREMENT_BLOCK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < class T, class Allocator >
|
template < class T, class Allocator >
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,15 @@ void test(const Cont &)
|
||||||
|
|
||||||
assert(c9.size() == v1.size() - 2);
|
assert(c9.size() == v1.size() - 2);
|
||||||
|
|
||||||
|
// test reserve
|
||||||
|
Cont c11;
|
||||||
|
c11.reserve(v1.size());
|
||||||
|
for(typename Vect::const_iterator it = v1.begin(); it != v1.end(); ++it)
|
||||||
|
c11.insert(*it);
|
||||||
|
|
||||||
|
assert(c11.size() == v1.size());
|
||||||
|
assert(c10 == c11);
|
||||||
|
|
||||||
// owns() and owns_dereferencable().
|
// owns() and owns_dereferencable().
|
||||||
for(typename Cont::const_iterator it = c9.begin(), end = c9.end(); it != end; ++it) {
|
for(typename Cont::const_iterator it = c9.begin(), end = c9.end(); it != end; ++it) {
|
||||||
assert(c9.owns(it));
|
assert(c9.owns(it));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue