#include #include #include #include using namespace Cntm; using namespace std; struct ValueType { short i, j; ValueType(short I, short J): i(I), j(J) { cerr << "{!V}"; } ValueType(const ValueType& Src): i(Src.i), j(Src.j) { cerr << "{+V}"; } ~ValueType() { i = j = -1; cerr << "{-V}"; } }; struct StoreType { int k; StoreType(): k(0) { cerr << "{@S}"; } StoreType(const StoreType& Src): k(Src.k) { cerr << "{+S}"; } StoreType& operator = (const StoreType& Src) { k = Src.k; cerr << "{=S}"; return *this; } ~StoreType() { k = -1; cerr << "{-S}"; } // Преобразование из ValueType StoreType(const ValueType& Src): k(Src.i * 65536 + Src.j) { cerr << "{>S}"; } // Преобразование в ValueType operator ValueType() { return ValueType(k / 65536, k % 65536); } }; void ContainerHandledListTypecasting() { // Использование перечня с приведением типов cout << "Использование перечня с приведением типов: "; typedef HandledList Reg0; Reg0 r0; cout << endl << " Добавление ValueType(2, 5) "; Reg0::Handle h1 = r0.Add(ValueType(2, 5)); cout << endl << " Дублирование хэндлов "; Reg0::Handle h2 = h1; cout << endl << " Создание перечислителя и получение первого значения "; Reg0::Enumerator e1 = r0.GetEnumerator(); ++e1; cout << endl << " Дублирование перечислителя "; Reg0::Enumerator e2 = e1; cout << endl << " "; cout << "считано [1.1]=ValueType(" << e1->i << ", " << e1->j << ") "; ++e1; cout << "считано [1.2]=ValueType(" << e1->i << ", " << e1->j << ") "; cout << endl << " "; cout << "считано [2.1]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; h1.Release(); ++e2; cout << "считано [2.2]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; if (!++e2) cout << " конец"; cout << endl; } void ContainerHandledListExp() { ContainerHandledListTypecasting(); cout << endl; typedef HandledList Reg1; Reg1 r1; { // Перечисление пустого перечня cout << "Перечисление пустого перечня: "; Reg1::Enumerator e11 = r1.GetEnumerator(); while (e11.Next()) cout << e11.Current() << " Ошибка!!!"; cout << endl; } Reg1::Handle h11 = r1.Add(1); // Перечисление перечня из 1 эл-та cout << "Перечисление перечня из 1 эл-та: "; Reg1::Enumerator e12 = r1.GetEnumerator(); while (e12.Next()) cout << e12.Current(); cout << endl; Reg1::Handle h12 = r1.Add(2); // Повторное использование перечислителя cout << "Повторное использование перечислителя: "; while (e12.Next()) cout << e12.Current() << ", "; cout << endl; // Перечисление перечня из 2 эл-тов cout << "Перечисление перечня из 2 эл-тов: "; Reg1::Enumerator e13 = r1.GetEnumerator(); while (++e13) cout << *e13 << ", "; cout << endl; // Использование 2-х перечислителей одновременно cout << "Использование 2-х перечислителей одновременно: "; e12.Reset(); e13.Reset(); while (++e13 && ++e12) cout << *e12 << "=" << *e13 << ", "; cout << endl; // Добавление и дублирование во время перечисления cout << "Добавление и дублирование во время перечисления: "; e12.Reset(); r1.Add(99); // Пустое добавление ++e12; cout << "[1]=" << *e12; ++e12; cout << ", [2]=" << *e12; Reg1::Enumerator e15 = e12; Reg1::Handle h13 = r1.Add(3); ++e12; cout << ", [3]=" << *e12; Reg1::Handle h14 = h13; ++e12; cout << ", [4]=" << *e12; h14 = h11; // Удаление второй 3 и добавление 1 ++e12; cout << ", [4+]=" << *e12; if (!++e12) cout << " конец"; cout << endl; // Копирование перечисления cout << "Копирование перечисления: "; cout << ", [2]=" << *e15; while (++e15) cout << *e15 << ", "; cout << endl; // Удаление во время перечисления cout << "Удаление во время перечисления: "; ++e12; cout << "[1]=" << *e12; h11.Release(); h12.Release(); ++e12; cout << ", [2]=" << *e12; ++e12; cout << ", [3]=" << *e12; h13.Release(); h14.Release(); ++e12; if (!e12) cout << " конец"; cout << endl; } void ContainerRegisterTypecasting() { // Использование перечня с приведением типов cerr << "Использование перечня с приведением типов: "; typedef Register Reg0; Reg0 r0; cerr << endl << " Добавление ValueType(2, 5) "; Reg0::Item h1(r0, ValueType(2, 5)); cerr << endl << " Дублирование хэндлов "; Reg0::Item h2 = h1; cerr << endl << " Создание перечислителя и получение первого значения "; Reg0::Enumerator e1 = r0.GetEnumerator(); ++e1; cerr << endl << " Дублирование перечислителя "; Reg0::Enumerator e2 = e1; cerr << endl << " "; cerr << "считано [1.1]=ValueType(" << e1->i << ", " << e1->j << ") "; ++e1; cerr << "считано [1.2]=ValueType(" << e1->i << ", " << e1->j << ") "; cerr << endl << " "; cerr << "считано [2.1]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; h1.Unassign(); ++e2; cerr << "считано [2.2]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; if (!++e2) cerr << " конец"; cerr << endl; } void ContainerRegisterExTypecasting() { // Использование перечня с приведением типов cerr << "Использование перечня с приведением типов: "; typedef RegisterEx Reg0; Reg0::Ptr r0(new Reg0); cerr << endl << " Добавление ValueType(2, 5) "; Reg0::Item h1(r0, ValueType(2, 5)); cerr << endl << " Дублирование хэндлов "; Reg0::Item h2 = h1; cerr << endl << " Создание перечислителя и получение первого значения "; Reg0::Enumerator e1 = r0->GetEnumerator(); ++e1; cerr << endl << " Теряем указатель на перечень"; r0.SetNull(); cerr << endl << " Дублирование перечислителя "; Reg0::Enumerator e2 = e1; cerr << endl << " "; cerr << "считано [1.1]=ValueType(" << e1->i << ", " << e1->j << ") "; ++e1; cerr << "считано [1.2]=ValueType(" << e1->i << ", " << e1->j << ") "; cerr << endl << " "; cerr << "считано [2.1]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; h1.Unassign(); ++e2; cerr << "считано [2.2]=ValueType(" << (*e2).i << ", " << (*e2).j << ") "; if (!++e2) cerr << " конец"; cerr << endl; } void ContainerRegisterExpNoDynamic() { typedef Register Reg1; Reg1 r1; // Перечисление пустого перечня cerr << "Перечисление пустого перечня: "; Reg1::Enumerator e11 = r1.GetEnumerator(false); while (e11.Next()) cerr << e11.Current() << " Ошибка!!!"; cerr << endl; // Добавление эл-та Reg1::Item h11(r1, 1); // Проверочное перечисление пустого перечислителя cerr << "Перечисление пустого перечня: "; while (e11.Next()) cerr << e11.Current() << " Ошибка!!!"; cerr << endl; cerr << "1 тест фиксированного перечислителя: ";cerr << endl; // Добавить 2 эл-та Reg1::Item h12(r1, 2); // Создать перечислитель Reg1::Enumerator e12 = r1.GetEnumerator(false); // Добавить 3 эл-т Reg1::Item h13(r1, 3); // Перечислить 2 эл-та e12.Next(); e12.Next(); if (!e12) cerr << " Ошибка!!!"<< endl; // Удалить 2 эл-т h12.Unassign(); // Пытаться перечислить 3 эл-т - конец e12.Next(); if (e12) cerr << " Ошибка!!!"<< endl; // Перечислить 1 эл-т e12.Next(); if (e12.Current() != 1) cerr << " Ошибка!!!" << endl; // Удалить 3 эл-т h13.Unassign(); // Пытаться перечислить - конец e12.Next(); if (e12) cerr << " Ошибка!!!"<< endl; // Перечислить 1 эл-т e12.Next(); if (!e12) cerr << " Ошибка!!!"<< endl; // Удалить 1 эл-т h11.Unassign(); // Добавить 4 эл-т Reg1::Item h14(r1, 4); // Перечислить один эл-т - конец e12.Next(); if (e12) cerr << " Ошибка!!!"<< endl; // Перечислить один эл-т - конец e12.Next(); if (e12) cerr << " Ошибка!!!"<< endl; cerr << "2 тест фиксированного перечислителя: ";cerr << endl; Reg1 r2; Reg1::Item h21(r2, 1); Reg1::Item h22(r2, 2); // Получаем перечислитель Reg1::Enumerator e21 = r2.GetEnumerator(false); // Перисляем 1 эл-т e21.Next(); if (e21.Current() != 1) cerr << " Ошибка!!!" << endl; // Копирование перечислителя 2 Reg1::Enumerator e22 = e21; // Перисляем 2 эл-т e21.Next(); if (e21.Current() != 2) cerr << " Ошибка!!!" << endl; // Удаление 2 эл-та h22.Unassign(); // Удаление 1 эл-та h21.Unassign(); // Добавление 3 эл-та Reg1::Item h23(r2, 3); // Копирование перечислителя 3 Reg1::Enumerator e23 = e21; // Перечисление 2 перечислителем - конец e22.Next(); if (e22) cerr << " Ошибка!!!"<< endl; // Перечисление 3 перечислителем - конец e23.Next(); if (e23) cerr << " Ошибка!!!"<< endl; cerr << "3 тест фиксированного перечислителя: ";cerr << endl; Reg1 r3; Reg1::Item h31(r3, 1); Reg1::Item h32(r3, 2); // Получаем перечислитель Reg1::Enumerator e31 = r3.GetEnumerator(false); // Перечисляем 2 эл-та e31.Next(); e31.Next(); if (!e31) cerr << " Ошибка!!!"<< endl; // Удаляем 1 эл-т h31.Unassign(); // Перечисляем - конец e31.Next(); if (e31) cerr << " Ошибка!!!"<< endl; // Перечисляем 2 эл-т e31.Next(); if (!e31) cerr << " Ошибка!!!"<< endl; // Добавить 3 эл-т Reg1::Item h33(r3, 3); // Перечисляем - конец e31.Next(); if (e31) cerr << " Ошибка!!!"<< endl; } void ContainerRegisterExp() { ContainerRegisterTypecasting(); cerr << endl; ContainerRegisterExTypecasting(); cerr << endl; ContainerRegisterExpNoDynamic(); cerr << endl; typedef Register Reg1; Reg1 r1; { // Перечисление пустого перечня cerr << "Перечисление пустого перечня: "; Reg1::Enumerator e11 = r1.GetEnumerator(); while (e11.Next()) cerr << e11.Current() << " Ошибка!!!"; cerr << endl; } Reg1::Item h11(r1, 1); // Перечисление перечня из 1 эл-та cerr << "Перечисление перечня из 1 эл-та: "; Reg1::Enumerator e12 = r1.GetEnumerator(); while (e12.Next()) cerr << e12.Current(); cerr << endl; Reg1::Item h12(r1, 2); // Повторное использование перечислителя cerr << "Повторное использование перечислителя: "; while (e12.Next()) cerr << e12.Current() << ", "; cerr << endl; // Перечисление перечня из 2 эл-тов cerr << "Перечисление перечня из 2 эл-тов: "; Reg1::Enumerator e13 = r1.GetEnumerator(); while (++e13) cerr << *e13 << ", "; cerr << endl; // Использование 2-х перечислителей одновременно cerr << "Использование 2-х перечислителей одновременно: "; e12.Reset(); e13.Reset(); while (++e13 && ++e12) cerr << *e12 << "=" << *e13 << ", "; cerr << endl; // Добавление и дублирование во время перечисления cerr << "Добавление и дублирование во время перечисления: "; e12.Reset(); ++e12; cerr << "[1]=" << *e12; ++e12; cerr << ", [2]=" << *e12; Reg1::Enumerator e15 = e12; Reg1::Item h13(r1, 3); ++e12; cerr << ", [3]=" << *e12; Reg1::Item h14 = h13; ++e12; cerr << ", [4]=" << *e12; h14 = h11; // Удаление второй 3 и добавление 1 ++e12; cerr << ", [4+]=" << *e12; if (!++e12) cerr << " конец"; cerr << endl; // Копирование перечисления cerr << "Копирование перечисления: "; cerr << ", [2]=" << *e15; while (++e15) cerr << *e15 << ", "; cerr << endl; // Удаление во время перечисления cerr << "Удаление во время перечисления: "; ++e12; cerr << "[1]=" << *e12; h11.Unassign(); h12.Unassign(); ++e12; cerr << ", [2]=" << *e12; ++e12; cerr << ", [3]=" << *e12; h13.Unassign(); h14.Unassign(); ++e12; if (!e12) cerr << " конец"; cerr << endl; }