// ННГУ, ВМК, Курс "Методы программирования-2", С++, ООП
//
// set.cpp - Copyright (c) Гергель В.П. 04.10.2001
//
// Множество - реализация через битовые поля

#include "set.h"

TSet :: TSet(int mp) : MaxPower(mp), BitField(mp) {}

TSet :: TSet(const TSet &s) : // конструктор копирования
  MaxPower(s.MaxPower), BitField(s.BitField) {
}

TSet :: TSet(const TBitField &bf) : // конструктор преобразования типа
  MaxPower(bf.GetLength()), BitField(bf){
}

TSet :: operator TBitField() { // преобразование типа к TBitField
  TBitField temp(this->BitField);
  return temp;
}

// максимальная мощность и проверка принадлежности элементов

int TSet :: GetMaxPower ( void ) const { // получить макс. к-во эл-тов
  return MaxPower;
}              /*---------------------------------------------*/

int TSet :: IsMember(const int Elem ) const { // элемент мн-ва ?
  return BitField.GetBit(Elem);
}              /*---------------------------------------------*/

// включение/исключение элемента множества

void TSet :: InsElem (const int Elem ) { // включение элемента множества
  BitField.SetBit(Elem);
}              /*---------------------------------------------*/

void TSet :: DelElem ( const int Elem ) { // исключение элемента множества
  BitField.ClrBit(Elem);
}              /*---------------------------------------------*/

// теоретико-множественные операции

TSet & TSet :: operator=(const TSet &s) { // присваивание
  BitField = s.BitField;
  MaxPower = s.GetMaxPower();
  return *this;
}              /*---------------------------------------------*/

int  TSet :: operator==(const TSet &s) {  // сравнение
  return BitField == s.BitField;
}              /*---------------------------------------------*/

TSet TSet :: operator+ (const TSet &s) {  // объединение
  TSet temp(BitField | s.BitField);
  return temp;
}              /*---------------------------------------------*/

TSet TSet :: operator* (const TSet &s) {  // пересечение
  TSet temp(BitField & s.BitField);
  return temp;
}              /*---------------------------------------------*/

TSet TSet :: operator~ ( void ) {  // дополнение
  TSet temp(~BitField);
  return temp;
}              /*---------------------------------------------*/

// перегрузка ввода/вывода

istream &operator>>(istream &istr, TSet &s) { // ввод
  // формат данных - { i1, i2,.., in }
  int temp; char ch;
  // поиск {
  do { istr >> ch; } while (ch != '{');
  // ввод элементов и включение в множество
  do {
    istr >> temp; s.InsElem(temp);
    do { istr >> ch; } while ( ( ch != ',' ) && ( ch != '}' ) );
  } while (ch != '}');
  return istr;
}              /*---------------------------------------------*/

ostream &operator<<(ostream &ostr, const TSet &s) { // вывод
  // формат данных - { i1, i2,.., in }
  int i, n; char ch = ' ';
  ostr << "{";
  // вывод элементов
  n = s.GetMaxPower();
  for ( i=0; i < n; i++ ) {
    if ( s.IsMember(i) ) { ostr << ch << ' ' << i; ch = ','; }
  }
  ostr << " }";
  return ostr;
}              /*---------------------------------------------*/
Хостинг от uCoz