On Dec 26, 2012, at 4:11 PM, Saleem Abdulrasool <[email protected]> wrote:
> Hi Bigcheese, chandlerc,
>
> Introduce a new countof template "macro" to determine the count of elements in
> a statically allocated array. Use this to remove the various static hardcoded
> values for array element counts (strftime_l takes number of characters to
> write,
> not the size of the buffer, though they are equivalent with char).
>
> Provide an overload which takes two pointers (iterators) and returns the count
> of elements that would fit in the array bounded by the iterators. Do this to
> avoid having to add a pointless static assertion along the lines of:
>
> static_assert(is_same<decltype(__ib),
> typename
> remove_reference<decltype(__ie)>::type>::value,
> "iterator type mismatch");
>
> to ensure that the iterator types match when performing the calculation using
> sizeof on either of the iterators to determine the size of a single element:
>
> (__ie - __ib) / sizeof(*__ib)
You should definitely include Howard Hinnant on this - since he's the primary
author of libc++.
Also, I think your second routine is incorrect:
> template <typename T>
> _LIBCPP_ALWAYS_INLINE size_t countof(const T * const begin, const T * const
> end)
> {
> return (end - begin) / sizeof(T);
> }
Consider calling it with ( ptr, prt + 1 )
It should return 1 in all cases - no matter what the type of "ptr" is.
But your code does not; it will return '0' for every type _except_ for ones
where sizeof(T) == 1
char *cp;
int *ip;
std::cout << "Char " << countof ( cp, cp + 1 ) << std::endl;
std::cout << "Int " << countof ( ip, ip + 1 ) << std::endl;
prints:
Char 1
Int 0
-- Marshall
Marshall Clow Idio Software <mailto:[email protected]>
A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly
moderated down to (-1, Flamebait).
-- Yu Suzuki
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits