#include #include #include #include #include "JLang/JVectorize.hh" #include "JLang/JComparison.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" namespace { struct __A__ { __A__() : i(0) {} __A__(const int __i) : i(__i) {} friend inline bool operator<(const __A__& first, const __A__& second) { return first.i < second.i; } friend inline std::ostream& operator<<(std::ostream& out, const __A__& object) { return out << object.i; } int i; }; /** * Print data. * * \param out output stream * \param debug debug level * \param message message * \param N number of elements * \param p pointer to data */ template void inline print(std::ostream& out, int debug, const char* const message, int N, T* p) { using namespace std; using namespace JPP; if (debug >- debug_t) { cout << setw(10) << left << message; for (int i = 0; i != N; ++i) { out << ' ' << setw(2) << p[i]; } cout << endl; } } } /** * \file * * Example program to test JLANG::make_set method. * \author mdejong */ int main(int argc, char **argv) { using namespace std; int debug; try { JParser<> zap("Example program to test selection of ordered data."); zap['d'] = make_field(debug) = 3; zap(argc, argv); } catch(const exception &error) { FATAL(error.what() << endl); } using namespace JPP; vector<__A__> buffer; int numberOfElements = 5; for (int i = 0; i != numberOfElements; ++i) { buffer.push_back(__A__(i)); } print(cout, debug, "original:", numberOfElements, buffer.data()); for (int index = 0; index != numberOfElements -1; ++ index) { buffer[index].i += 1; print(cout, debug, "before:", numberOfElements, buffer.data()); const int N = distance(buffer.begin(), make_set(buffer.begin(), buffer.end(), &__A__::i, JComparison::lt())); print(cout, debug, "after:", N, buffer.data()); ASSERT(N == numberOfElements - 1); for (int i = 0; i != index; ++i) { ASSERT(buffer[i].i == i); } for (int i = index; i != N; ++i) { ASSERT(buffer[i].i == i+1); } buffer[N].i = index; sort(buffer.begin(), buffer.end()); } { const int index = numberOfElements - 1; buffer[index].i += 1; print(cout, debug, "before:", numberOfElements, buffer.data()); const int N = distance(buffer.begin(), make_set(buffer.begin(), buffer.end(), &__A__::i, JComparison::lt())); print(cout, debug, "after:", N, buffer.data()); ASSERT(N == numberOfElements); buffer[index].i = index; } { const int index = 0; buffer[index].i -= 1; print(cout, debug, "before:", numberOfElements, buffer.data()); const int N = distance(buffer.begin(), make_set(buffer.begin(), buffer.end(), &__A__::i, JComparison::lt())); print(cout, debug, "after:", N, buffer.data()); ASSERT(N == numberOfElements); buffer[index].i = index; } for (int index = 1; index != numberOfElements; ++ index) { buffer[index].i -= 1; print(cout, debug, "before:", numberOfElements, buffer.data()); const int N = distance(buffer.begin(), make_set(buffer.begin(), buffer.end(), &__A__::i, JComparison::lt())); print(cout, debug, "after:", N, buffer.data()); ASSERT(N == numberOfElements - 1); for (int i = 0; i != index; ++i) { ASSERT(buffer[i].i == i); } for (int i = index; i != N; ++i) { ASSERT(buffer[i].i == i+1); } buffer[N].i = index; sort(buffer.begin(), buffer.end()); } return 0; }