diff --git a/sln/vc10/bitfield/bitfield.vcxproj b/sln/vc10/bitfield/bitfield.vcxproj
index f4b10eb18..8c1f388bc 100644
--- a/sln/vc10/bitfield/bitfield.vcxproj
+++ b/sln/vc10/bitfield/bitfield.vcxproj
@@ -20,10 +20,12 @@
StaticLibrary
Unicode
true
+ v142
StaticLibrary
Unicode
+ v142
diff --git a/sln/vc10/gtest/gtest.vcxproj b/sln/vc10/gtest/gtest.vcxproj
index 518510409..b2bdb3f1c 100644
--- a/sln/vc10/gtest/gtest.vcxproj
+++ b/sln/vc10/gtest/gtest.vcxproj
@@ -20,10 +20,12 @@
StaticLibrary
Unicode
true
+ v142
StaticLibrary
Unicode
+ v142
diff --git a/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj b/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj
index 981eb64a1..6c567c368 100644
--- a/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj
+++ b/sln/vc10/sample_prime_numbers/sample_prime_numbers.vcxproj
@@ -20,10 +20,12 @@
Application
Unicode
true
+ v142
Application
Unicode
+ v142
diff --git a/sln/vc10/test_bitfield/test_bitfield.vcxproj b/sln/vc10/test_bitfield/test_bitfield.vcxproj
index 5b72614b8..eb9d8581f 100644
--- a/sln/vc10/test_bitfield/test_bitfield.vcxproj
+++ b/sln/vc10/test_bitfield/test_bitfield.vcxproj
@@ -20,10 +20,12 @@
Application
Unicode
true
+ v142
Application
Unicode
+ v142
diff --git a/src/tbitfield.cpp b/src/tbitfield.cpp
index 3bfa48182..b332fefd4 100644
--- a/src/tbitfield.cpp
+++ b/src/tbitfield.cpp
@@ -5,6 +5,7 @@
//
// Битовое поле
+#include
#include "tbitfield.h"
// Fake variables used as placeholders in tests
@@ -13,86 +14,187 @@ static TBitField FAKE_BITFIELD(1);
TBitField::TBitField(int len)
{
-}
-
-TBitField::TBitField(const TBitField &bf) // конструктор копирования
-{
+ if (len <= 0) throw "Error";
+ BitLen = len;
+ MemLen = (BitLen / (sizeof(TELEM) * 8)) + 1;
+ pMem = new TELEM[MemLen];
+ for (int i = 0; i < MemLen; i++)
+ pMem[i] = 0;
+}
+
+TBitField::TBitField(const TBitField& bf) // конструктор копирования
+{
+ if (bf.pMem == 0)
+ {
+ pMem = 0;
+ MemLen = 0;
+ }
+ else
+ {
+ BitLen = bf.BitLen;
+ MemLen = bf.MemLen;
+ pMem = new TELEM[MemLen];
+ for (int i = 0; i < MemLen; i++)
+ {
+ pMem[i] = bf.pMem[i];
+ }
+ }
}
TBitField::~TBitField()
{
+ if (pMem != 0)
+ {
+ delete[] pMem;
+ pMem = 0;
+ MemLen = 0;
+ }
}
int TBitField::GetMemIndex(const int n) const // индекс Мем для бита n
{
- return FAKE_INT;
+ if ((n < 0) || (n >= BitLen)) throw "Error";
+ return (n / (sizeof(TELEM) * 8));
}
TELEM TBitField::GetMemMask(const int n) const // битовая маска для бита n
{
- return FAKE_INT;
+ int m = 1;
+ return m << (n & (sizeof(TELEM) * 8 - 1));
}
// доступ к битам битового поля
int TBitField::GetLength(void) const // получить длину (к-во битов)
{
- return FAKE_INT;
+ return BitLen;
}
void TBitField::SetBit(const int n) // установить бит
{
+ if ((n < 0) || (n >= BitLen)) throw "Error";
+ int i = GetMemIndex(n);
+ int m = GetMemMask(n);
+ pMem[i] = pMem[i] | m;
}
void TBitField::ClrBit(const int n) // очистить бит
{
+ if ((n < 0) || (n >= BitLen)) throw "Error";
+ int i = GetMemIndex(n);
+ int m = GetMemMask(n);
+ pMem[i] = pMem[i] & ~m;
}
int TBitField::GetBit(const int n) const // получить значение бита
{
- return FAKE_INT;
+ if ((n < 0) || (n >= BitLen)) throw "Error";
+ int i = GetMemIndex(n);
+ return (pMem[i] & GetMemMask(n));
}
// битовые операции
-TBitField& TBitField::operator=(const TBitField &bf) // присваивание
-{
- return FAKE_BITFIELD;
-}
-
-int TBitField::operator==(const TBitField &bf) const // сравнение
-{
- return FAKE_INT;
-}
-
-int TBitField::operator!=(const TBitField &bf) const // сравнение
-{
- return FAKE_INT;
-}
-
-TBitField TBitField::operator|(const TBitField &bf) // операция "или"
-{
- return FAKE_BITFIELD;
-}
-
-TBitField TBitField::operator&(const TBitField &bf) // операция "и"
-{
- return FAKE_BITFIELD;
+TBitField& TBitField::operator=(const TBitField& bf) // присваивание
+{
+ if (this != &bf)
+ {
+ delete[] pMem;
+ BitLen = bf.BitLen;
+ MemLen = bf.MemLen;
+ pMem = new TELEM[MemLen];
+ for (int i = 0; i < MemLen; i++)
+ pMem[i] = bf.pMem[i];
+ }
+ return *this;
+}
+
+int TBitField::operator==(const TBitField& bf) const // сравнение
+{
+ int res = 1;
+ if (BitLen != bf.BitLen)
+ res = 0;
+ else
+ for (int i = 0; i < MemLen; i++)
+ if (pMem[i] != bf.pMem[i])
+ {
+ res = 0;
+ break;
+ }
+ return res;
+}
+
+int TBitField::operator!=(const TBitField& bf) const // сравнение
+{
+ int res = 0;
+ if (BitLen != bf.BitLen)
+ res = 1;
+ else
+ for (int i = 0; i < MemLen; i++)
+ if (pMem[i] != bf.pMem[i])
+ {
+ res = 1;
+ break;
+ }
+ return res;
+}
+
+TBitField TBitField::operator|(const TBitField& bf) // операция "или"
+{
+ int len = BitLen;
+ if (bf.BitLen > len)
+ len = bf.BitLen;
+ TBitField temp(len);
+ for (int i = 0; i < MemLen; i++)
+ temp.pMem[i] = pMem[i];
+ for (int i = 0; i < bf.MemLen; i++)
+ temp.pMem[i] |= bf.pMem[i];
+ return temp;
+}
+
+TBitField TBitField::operator&(const TBitField& bf) // операция "и"
+{
+ int len = BitLen;
+ if (bf.BitLen > len)
+ len = bf.BitLen;
+ TBitField temp(len);
+ for (int i = 0; i < MemLen; i++)
+ temp.pMem[i] = pMem[i];
+ for (int i = 0; i < bf.MemLen; i++)
+ temp.pMem[i] &= bf.pMem[i];
+ return temp;
}
TBitField TBitField::operator~(void) // отрицание
{
- return FAKE_BITFIELD;
+ int len = BitLen;
+ TBitField temp(len);
+ for (int i = 0; i < BitLen; i++)
+ if (GetBit(i) == 0)
+ temp.SetBit(i);
+ else
+ temp.ClrBit(i);
+ return temp;
}
// ввод/вывод
-istream &operator>>(istream &istr, TBitField &bf) // ввод
+istream& operator>>(istream& istr, TBitField& bf) // ввод
{
- return istr;
+ for (int i = 0; i < bf.MemLen; i++)
+ {
+ istr >> bf.MemLen;
+ for (int i = 0; i < bf.MemLen; i++)
+ istr >> bf.pMem[i];
+ }
+ return istr;
}
-ostream &operator<<(ostream &ostr, const TBitField &bf) // вывод
+ostream& operator<<(ostream& ostr, const TBitField& bf) // вывод
{
- return ostr;
+ for (int i = 0; i < bf.MemLen; i++)
+ {
+ ostr << bf.pMem[i] << "\t";
+ }
+ return ostr;
}
diff --git a/src/tset.cpp b/src/tset.cpp
index e70a76e58..c1c0d7900 100644
--- a/src/tset.cpp
+++ b/src/tset.cpp
@@ -12,93 +12,126 @@ static const int FAKE_INT = -1;
static TBitField FAKE_BITFIELD(1);
static TSet FAKE_SET(1);
-TSet::TSet(int mp) : BitField(-1)
+TSet::TSet(int mp) : BitField(mp)
{
+ MaxPower = mp;
}
// конструктор копирования
-TSet::TSet(const TSet &s) : BitField(-1)
+TSet::TSet(const TSet& s) : BitField(s.BitField)
{
+ MaxPower = s.MaxPower;
+ BitField = s.BitField;
}
// конструктор преобразования типа
-TSet::TSet(const TBitField &bf) : BitField(-1)
+TSet::TSet(const TBitField& bf) : BitField(bf)
{
+ MaxPower = bf.GetLength();
+ BitField = bf;
}
TSet::operator TBitField()
{
- return FAKE_BITFIELD;
+ TBitField tmp = (TBitField)*this;
+ return tmp;
}
int TSet::GetMaxPower(void) const // получить макс. к-во эл-тов
{
- return FAKE_INT;
+ return MaxPower;
}
int TSet::IsMember(const int Elem) const // элемент множества?
{
- return FAKE_INT;
+ if ((Elem < 0) || (Elem >= MaxPower)) throw "Error";
+ return BitField.GetBit(Elem);
}
void TSet::InsElem(const int Elem) // включение элемента множества
{
+ if ((Elem < 0) || (Elem >= MaxPower)) throw "Error";
+ BitField.SetBit(Elem);
}
void TSet::DelElem(const int Elem) // исключение элемента множества
{
+ if ((Elem < 0) || (Elem >= MaxPower)) throw "Error";
+ BitField.ClrBit(Elem);
}
// теоретико-множественные операции
-TSet& TSet::operator=(const TSet &s) // присваивание
+TSet& TSet::operator=(const TSet& s) // присваивание
{
- return FAKE_SET;
+ BitField = s.BitField;
+ MaxPower = s.GetMaxPower();
+ return *this;
}
-int TSet::operator==(const TSet &s) const // сравнение
+int TSet::operator==(const TSet& s) const // сравнение
{
- return FAKE_INT;
+ return BitField == s.BitField;
}
-int TSet::operator!=(const TSet &s) const // сравнение
+int TSet::operator!=(const TSet& s) const // сравнение
{
- return FAKE_INT;
+ return BitField != s.BitField;
}
-TSet TSet::operator+(const TSet &s) // объединение
+TSet TSet::operator+(const TSet& s) // объединение
{
- return FAKE_SET;
+ int x = MaxPower;
+ if (MaxPower < s.MaxPower)
+ x = s.MaxPower;
+ TSet res(x);
+ res = BitField | s.BitField;
+ return res;
}
TSet TSet::operator+(const int Elem) // объединение с элементом
{
- return FAKE_SET;
+ if ((Elem < 0) || (Elem >= MaxPower)) throw "Error";
+ TSet res(MaxPower);
+ res.InsElem(Elem);
+ return res;
}
TSet TSet::operator-(const int Elem) // разность с элементом
{
- return FAKE_SET;
+ if ((Elem < 0) || (Elem >= MaxPower)) throw "Error";
+ TSet res(MaxPower);
+ res.DelElem(Elem);
+ return res;
}
-TSet TSet::operator*(const TSet &s) // пересечение
+TSet TSet::operator*(const TSet& s) // пересечение
{
- return FAKE_SET;
+ int len = MaxPower;
+ if (s.MaxPower > MaxPower)
+ len = s.MaxPower;
+ TSet res(len);
+ res = BitField & s.BitField;
+ return res;
}
TSet TSet::operator~(void) // дополнение
{
- return FAKE_SET;
+ TSet tmp(*this);
+ tmp.BitField = ~tmp.BitField;
+ return tmp;
}
// перегрузка ввода/вывода
-istream &operator>>(istream &istr, TSet &s) // ввод
+istream& operator>>(istream& istr, TSet& s) // ввод
{
- return istr;
+ istr >> s.BitField;
+ return istr;
}
-ostream& operator<<(ostream &ostr, const TSet &s) // вывод
+ostream& operator<<(ostream& ostr, const TSet& s) // вывод
{
- return ostr;
+ ostr << s.BitField;
+ return ostr;
}