Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 239f4534 authored by Ryan Prichard's avatar Ryan Prichard
Browse files

Add InlineStdAllocator::rebind struct member

Newer versions of libc++ (as well as libstdc++) require this of
allocators. This member is needed for
std::allocator_traits<InlineStdAllocator<T, SIZE>>::rebind_alloc<U>,
which contains a typedef for InlineStdAllocator<U>. I believe this
requirement was always present, but libc++ is checking for it now.

AFAICT, the STL wouldn't be able to construct an InlineStdAllocator<U>,
because there is no default constructor, and the copy constructor
wouldn't accept a reference to InlineStdAllocator<T>. Perhaps that's OK
because this allocator is only used with std::vector, not (say)
std::list or std::map, which actually need to allocate internal node
types.

std::allocator_traits::rebind_alloc can automatically handle custom
allocators with type parameters, but not with non-type parameters
(i.e. It can't handle "size_t SIZE = 4"). See
https://stackoverflow.com/a/34863387.

Bug: b/175635923
Test: treehugger
Change-Id: I0cceb47ab780414202cef1ed54fa7deb3773d01a
parent 39a9427c
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -65,6 +65,17 @@ public:
            free(p);
        }
    }

    // The STL checks that this member type is present so that
    // std::allocator_traits<InlineStdAllocator<T, SIZE>>::rebind_alloc<Other>
    // works. std::vector won't be able to construct an
    // InlineStdAllocator<Other, SIZE>, because InlineStdAllocator has no
    // default constructor, but vector presumably doesn't rebind the allocator
    // because it doesn't allocate internal node types.
    template <class Other>
    struct rebind {
        typedef InlineStdAllocator<Other, SIZE> other;
    };
    Allocation& mAllocation;
};