Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ShBitSet.cpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright (c) 2003 University of Waterloo Computer Graphics Laboratory
00004 // Project administrator: Michael D. McCool
00005 // Authors: Zheng Qin, Stefanus Du Toit, Kevin Moule, Tiberiu S. Popa,
00006 //          Michael D. McCool
00007 // 
00008 // This software is provided 'as-is', without any express or implied
00009 // warranty. In no event will the authors be held liable for any damages
00010 // arising from the use of this software.
00011 // 
00012 // Permission is granted to anyone to use this software for any purpose,
00013 // including commercial applications, and to alter it and redistribute it
00014 // freely, subject to the following restrictions:
00015 // 
00016 // 1. The origin of this software must not be misrepresented; you must
00017 // not claim that you wrote the original software. If you use this
00018 // software in a product, an acknowledgment in the product documentation
00019 // would be appreciated but is not required.
00020 // 
00021 // 2. Altered source versions must be plainly marked as such, and must
00022 // not be misrepresented as being the original software.
00023 // 
00024 // 3. This notice may not be removed or altered from any source
00025 // distribution.
00027 
00028 #include <cstring>
00029 #include <iostream>
00030 #include "ShBitSet.hpp"
00031 #include "ShDebug.hpp"
00032 #include "ShError.hpp"
00033 
00034 #define WORD_SIZE sizeof(unsigned int)
00035 
00036 namespace {
00037 
00038 std::size_t wordsize(std::size_t size)
00039 {
00040   return size / WORD_SIZE + (size % WORD_SIZE ? 1 : 0);
00041 }
00042 
00043 std::size_t fullwordsize(std::size_t size)
00044 {
00045   return size / WORD_SIZE;
00046 }
00047 
00048 }
00049 
00050 namespace SH {
00051 
00052 ShBitRef::operator bool() const
00053 {
00054   return (((*m_byte) & m_mask) == m_mask);
00055 }
00056 
00057 ShBitRef& ShBitRef::operator=(bool b)
00058 {
00059   if (b) {
00060     *m_byte |= m_mask;
00061   } else {
00062     *m_byte &= ~m_mask;
00063   }
00064 
00065   return (*this);
00066 }
00067 
00068 ShBitRef::ShBitRef(unsigned int* byte, unsigned int mask)
00069   : m_byte(byte), m_mask(mask)
00070 {
00071 }
00072 
00073 ShBitSet::ShBitSet()
00074   : m_size(0), m_data(0)
00075 {
00076 }
00077 
00078 ShBitSet::ShBitSet(std::size_t size)
00079   : m_size(size), m_data(new unsigned int[wordsize(m_size)])
00080 {
00081   for (std::size_t i = 0; i < wordsize(m_size); i++) {
00082     m_data[i] = 0;
00083   }
00084 }
00085 
00086 ShBitSet::ShBitSet(const ShBitSet& other)
00087   : m_size(other.m_size), m_data(new unsigned int[wordsize(m_size)])
00088 {
00089   memcpy(m_data, other.m_data, wordsize(m_size) * WORD_SIZE);
00090 }
00091 
00092 ShBitSet::~ShBitSet()
00093 {
00094   delete [] m_data;
00095 }
00096 
00097 ShBitSet& ShBitSet::operator=(const ShBitSet& other)
00098 {
00099   delete [] m_data;
00100   m_size = other.m_size;
00101   m_data = new unsigned int[wordsize(m_size)];
00102   memcpy(m_data, other.m_data, wordsize(m_size) * WORD_SIZE);
00103 
00104   return (*this);
00105 }
00106 
00107 ShBitSet& ShBitSet::operator&=(const ShBitSet& other)
00108 {
00109   if (m_size != other.m_size) shError( ShException( "ShBitSet operands of &= must be the same size." ) );
00110   for (std::size_t i = 0; i < wordsize(m_size); i++)
00111     m_data[i] &= other.m_data[i];
00112   return *this;
00113 }
00114 
00115 ShBitSet& ShBitSet::operator|=(const ShBitSet& other)
00116 {
00117   if (m_size != other.m_size) shError( ShException( "ShBitSet operands of |= must be the same size." ) );
00118   for (std::size_t i = 0; i < wordsize(m_size); i++)
00119     m_data[i] |= other.m_data[i];
00120   return *this;
00121 }
00122 
00123 ShBitSet& ShBitSet::operator^=(const ShBitSet& other)
00124 {
00125   if (m_size != other.m_size) shError( ShException( "ShBitSet operands of ^= must be the same size." ) );
00126   for (std::size_t i = 0; i < wordsize(m_size); i++)
00127     m_data[i] ^= other.m_data[i];
00128   return *this;
00129 }
00130 
00131 ShBitSet ShBitSet::operator&(const ShBitSet& other) const
00132 {
00133   ShBitSet ret(*this);
00134   ret &= other;
00135   return ret;
00136 }
00137 
00138 ShBitSet ShBitSet::operator|(const ShBitSet& other) const
00139 {
00140   ShBitSet ret(*this);
00141   ret |= other;
00142   return ret;
00143 }
00144 
00145 ShBitSet ShBitSet::operator^(const ShBitSet& other) const
00146 {
00147   ShBitSet ret(*this);
00148   ret ^= other;
00149   return ret;
00150 }
00151 
00152 ShBitSet ShBitSet::operator~() const
00153 {
00154   ShBitSet ret(m_size);
00155   for (std::size_t i = 0; i < wordsize(m_size); i++)
00156     ret.m_data[i] = ~m_data[i];
00157   return ret;
00158 }
00159 
00160 bool ShBitSet::operator==(const ShBitSet& other) const
00161 {
00162   if (m_size != other.m_size) return false;
00163   for (unsigned int i = 0; i < fullwordsize(m_size); i++) {
00164     if (m_data[i] != other.m_data[i]) return false;
00165   }
00166   if (m_size % WORD_SIZE) {
00167     unsigned int mask = (1 << ((m_size % WORD_SIZE) + 1)) - 1;
00168     return ((m_data[m_size / WORD_SIZE] & mask) == (other.m_data[m_size / WORD_SIZE] & mask));
00169   }
00170   return true;
00171 }
00172 
00173 bool ShBitSet::operator!=(const ShBitSet& other) const
00174 {
00175   return !(*this == other);
00176 }
00177 
00178 std::size_t ShBitSet::size() const
00179 {
00180   return m_size;
00181 }
00182 
00183 bool ShBitSet::full() const
00184 {
00185   for (int i = 0; i < fullwordsize(m_size); i++) {
00186     if (~m_data[i]) return false;
00187   }
00188   if (m_size % WORD_SIZE) {
00189     unsigned int mask = (1 << ((m_size % WORD_SIZE) + 1)) - 1;
00190     return (m_data[m_size / WORD_SIZE] & mask) == mask;
00191   }
00192   
00193   return true;
00194 }
00195 
00196 bool ShBitSet::empty() const
00197 {
00198   for (int i = 0; i < wordsize(m_size); i++) if (m_data[i]) return false;
00199   return true;
00200 }
00201 
00202 bool ShBitSet::operator[](std::size_t i) const
00203 {
00204   return ((m_data[i / WORD_SIZE] & (1 << (i % WORD_SIZE))) != 0);
00205 }
00206 
00207 ShBitRef ShBitSet::operator[](std::size_t i)
00208 {
00209   return ShBitRef(m_data + (i / WORD_SIZE), 1 << (i % WORD_SIZE));
00210 }
00211 
00212 std::ostream& operator<<(std::ostream& out, const ShBitSet& bitset)
00213 {
00214   for (std::size_t i = 0; i < bitset.size(); i++) {
00215     out << (bitset[i] ? '1' : '0');
00216   }
00217   return out;
00218 }
00219 
00220 }

Generated on Mon Jan 24 18:36:30 2005 for Sh by  doxygen 1.4.1