[webkit-dev] Forward.h's Vector
Maciej Stachowiak
mjs at apple.com
Wed Sep 13 11:07:25 PDT 2017
> On Sep 13, 2017, at 8:11 AM, JF Bastien <jfbastien at apple.com> wrote:
>
> Hello WebCritters,
>
> I’m moving some code around, and one particular header I have is included everywhere in JSC so I’d like it to be lightweight and include as few other headers as possible. It unfortunately uses WTF::Vector, but it only does so as a pointer:
>
> void ohNoes(Vector<Noms>*);
>
> It seems like something a forward declaration would fix nicely, and oh joy and wonder we have Forward.h just for this! Here’s what it does:
>
> template<typename T, size_t inlineCapacity, typename OverflowHandler, size_t minCapacity, typename Malloc> class Vector;
>
> That’s nice and great for T, but all the other template parameters are SOL because Vector is actually declared with default template parameters:
>
> template<typename T, size_t inlineCapacity = 0, typename OverflowHandler = CrashOnOverflow, size_t minCapacity = 16, typename Malloc = FastMalloc>
> class Vector : private VectorBuffer<T, inlineCapacity, Malloc> {
>
> The extra painful thing is that, contrary to what I originally thought, one cannot declare Vector in Forward.h and then define it in Vector.h with the same defaults twice! Ideally the compiler would just yell at a mismatch, but instead it says error: template parameter redefines default argument (thanks clang, that’s exactly what I’m trying to do, just tell me if you catch a mismatch and ODR away otherwise).
>
> Here’s what I propose:
>
> Change the forward declaration in Forward.h to contain the default template parameters (and forward-declare CrashOnOverflow).
> Remove these default template parameters from Vector.h.
> Include Forward.h in Vector.h.
> Optionally, if the WebCritters think it useful, leave a comment just above the Vector definition redirecting to Forward.h for defaults (or more fancy, use size_t inlineCapacity /*=0*/ style like LLVM’s codebase does, and have a tool that checks for consistency).
> Optionally, try to fix C++20 so this isn’t A Thing anymore. Note that my hopes are low because of modules (why fix it if modules will magically make this not a thing).
>
> Alternatively, I could just include Vector.h and be done with it.
>
> Thoughts?
Is there anything in Forward.h that should not be included everywhere you include Vector.h, whether for efficiency or any other reasons? That's the only potential thing I can think of that may be wrong with this plan. In that case, the simple fix would be to have a separate VectorForward.h which can be included by both.
- Maciej
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-dev/attachments/20170913/5dd233dd/attachment.html>
More information about the webkit-dev
mailing list