

//////////////////////////////////////////////
// Extracted from stlsoft/stlsoft.h

template <int N>
struct ss_array_size_struct
{
    char    c[N];
};

template <class T, int N>
ss_array_size_struct<N> const &ss_static_array_size(T (&)[N]);

#   define stlsoft_ns_qual(x)                           x
#   define STLSOFT_NUM_ELEMENTS(ar)                     sizeof(stlsoft_ns_qual(ss_static_array_size)(ar))

//////////////////////////////////////////////

int main()
{
    // SUCCEEDS
    {
        int             ai[10];
        const unsigned  n       =   STLSOFT_NUM_ELEMENTS(ai);
    }

    // SUCCEEDS
    {
        int             ai[]    =   { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        const unsigned  n       =   STLSOFT_NUM_ELEMENTS(ai);
    }

    // SUCCEEDS
    {
        char            r1[]    =   "abcdefghfijklm";
        const unsigned  n       =   STLSOFT_NUM_ELEMENTS(r1);
    }

    // FAILS
    {
        const char      r1[]    =   { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm' };
        const unsigned  n       =   STLSOFT_NUM_ELEMENTS(r1);
    }

    // FAILS
    {
        const char      r1[]    =   "abcdefghfijklm";
        const unsigned  n       =   STLSOFT_NUM_ELEMENTS(r1);
    }

    return 0;
}
