On 12/02/2013 05:23 AM, Kinkie wrote: >> > My point was that joining SBuf containers is useful for all container >> > types, but your code only works for std::lists. I think you can provide >> > the same functionality, with the same level of optimization, by making >> > the code generic. Here is a sketch: >> > >> > { >> > SBuf::size_type mergedSize = 0; >> > std::accumulate(..., mergedSize, AddSize(separator)); >> > >> > SBuf merged; >> > merged.reserveSpace(mergedSize); >> > std::accumulate(..., merged, AddContent(separator)); >> > >> > return merged; >> > } >> > >> > The missing "..." parts just contain items.begin(), items.end(), where >> > bufs is the container.
> Ok. > Let's try to sketch the grand plan, shall we? > What about using a SBufAlgs.h which contains > > SBufEqual > SBufStartsWith > SBufAddLength(separator=SBuf()) Sounds good to me. I do not think you need a default value for the separator in the SBufAddLength. AFAICT, You will also need an SBufAddContent class "operator" with the following constructor (similar to SBufAddLength): SBufAddContent::SBufAddContent(const SBuf &separator); And, if you insist that IsMember() wrapper is needed, it can be placed in the same header file as well. Make it generic like the SBufJoin() below. > template<class container> SBufContainerJoin<container>(...) This one will be more like template<class Container> SBuf SBufJoin(const Container &items, ...) { ... see the sketch above ... } > plus a specialized SBufListJoin which is simply an instantiation of > SBufContainerJoin<SBufList>? What will that specialization do differently? I do not think we need it but perhaps I am missing something. Thank you, Alex.