#include <stdio.h>
#include <vector>
#include <algorithm>
typedef std::vector<int> intvector;

intvector makevector(const int *tests, unsigned ix)
{
    intvector v;
    while (ix)
    {
        if (ix&1)
            v.push_back(*tests);
        tests++;
        ix>>=1;
    }
    return v;
}
template<typename I>
void printiter(I i, I last)
{
    if (i==last) printf(" --------"); else printf(" %08x", *i);
}

int main(int,char**)
{
    int tests[]= {-0x808, 0, 0x808, 0x626200-0x808, 0x626200, 0x626200+0x808, 0xacac00-0x808, 0xacac00, 0xacac00+0x808};
    const unsigned ntests= sizeof(tests)/sizeof(*tests);
    const unsigned nsets= 1<<ntests;

printf("   x              lb       ub      lb--      ub--  min(x<=R) min(x<R) max(x>R) max(x>=R) min(x>=R) min(x>R) max(x<R) max(x<=R)\n");
    int n=0;
    for (unsigned setix= 0 ; setix<nsets ; setix++) {
        intvector v= makevector(tests, setix);

        for (unsigned i=0 ; i<ntests ; i++) {
            int x= tests[i];
            auto lb= std::lower_bound(v.begin(), v.end(), x);
            auto ub= std::upper_bound(v.begin(), v.end(), x);
            auto yb= std::lower_bound(v.begin(), v.end(), x); if (yb==v.begin()) yb= v.end(); else yb--;
            auto xb= std::upper_bound(v.begin(), v.end(), x); if (xb==v.begin()) xb= v.end(); else xb--;

            auto za= std::find_if(v.begin(),  v.end(),  [x](int y) { return x<=y; });
            auto zb= std::find_if(v.begin(),  v.end(),  [x](int y) { return x<y; });
            auto zc= std::find_if(v.rbegin(), v.rend(), [x](int y) { return x>y; });
            auto zcc= zc==v.rend() ? v.end() : v.begin()+(v.size()-1-(zc-v.rbegin()));
            auto zd= std::find_if(v.rbegin(), v.rend(), [x](int y) { return x>=y; });
            auto zdd= zd==v.rend() ? v.end() : v.begin()+(v.size()-1-(zd-v.rbegin()));

            if (lb!=za)  printf("%d:%d:lb!=za\n", setix, i);
            if (ub!=zb)  printf("%d:%d:ub!=zb\n", setix, i);
            if (yb!=zcc) printf("%d:%d:yb!=zc\n", setix, i);
            if (xb!=zdd) printf("%d:%d:xb!=zd\n", setix, i);

            if (setix==0x92) {
                // make output look like xlb.cpp
                printf("%08x . . . ", x);
                printiter(lb, v.end());
                printiter(ub, v.end());
                printiter(yb, v.end());
                printiter(xb, v.end());

                printiter(za, v.end());
                printiter(zb, v.end());
                printiter(zcc, v.end());
                printiter(zdd, v.end());
                printf("\n");
            }
            n++;
        }
    }
    printf("%d tested\n", n);

    return 0;

}

