123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /***********************************************************************
- * Software License Agreement (BSD License)
- *
- * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
- * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
- *
- * THE BSD LICENSE
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *************************************************************************/
- /***********************************************************************
- * Author: Vincent Rabaud
- *************************************************************************/
- #ifndef OPENCV_FLANN_DYNAMIC_BITSET_H_
- #define OPENCV_FLANN_DYNAMIC_BITSET_H_
- #ifndef FLANN_USE_BOOST
- # define FLANN_USE_BOOST 0
- #endif
- //#define FLANN_USE_BOOST 1
- #if FLANN_USE_BOOST
- #include <boost/dynamic_bitset.hpp>
- typedef boost::dynamic_bitset<> DynamicBitset;
- #else
- #include <limits.h>
- #include "dist.h"
- namespace cvflann {
- /** Class re-implementing the boost version of it
- * This helps not depending on boost, it also does not do the bound checks
- * and has a way to reset a block for speed
- */
- class DynamicBitset
- {
- public:
- /** default constructor
- */
- DynamicBitset() : size_(0)
- {
- }
- /** only constructor we use in our code
- * @param sz the size of the bitset (in bits)
- */
- DynamicBitset(size_t sz)
- {
- resize(sz);
- reset();
- }
- /** Sets all the bits to 0
- */
- void clear()
- {
- std::fill(bitset_.begin(), bitset_.end(), 0);
- }
- /** @brief checks if the bitset is empty
- * @return true if the bitset is empty
- */
- bool empty() const
- {
- return bitset_.empty();
- }
- /** set all the bits to 0
- */
- void reset()
- {
- std::fill(bitset_.begin(), bitset_.end(), 0);
- }
- /** @brief set one bit to 0
- * @param index
- */
- void reset(size_t index)
- {
- bitset_[index / cell_bit_size_] &= ~(size_t(1) << (index % cell_bit_size_));
- }
- /** @brief sets a specific bit to 0, and more bits too
- * This function is useful when resetting a given set of bits so that the
- * whole bitset ends up being 0: if that's the case, we don't care about setting
- * other bits to 0
- * @param index
- */
- void reset_block(size_t index)
- {
- bitset_[index / cell_bit_size_] = 0;
- }
- /** resize the bitset so that it contains at least sz bits
- * @param sz
- */
- void resize(size_t sz)
- {
- size_ = sz;
- bitset_.resize(sz / cell_bit_size_ + 1);
- }
- /** set a bit to true
- * @param index the index of the bit to set to 1
- */
- void set(size_t index)
- {
- bitset_[index / cell_bit_size_] |= size_t(1) << (index % cell_bit_size_);
- }
- /** gives the number of contained bits
- */
- size_t size() const
- {
- return size_;
- }
- /** check if a bit is set
- * @param index the index of the bit to check
- * @return true if the bit is set
- */
- bool test(size_t index) const
- {
- return (bitset_[index / cell_bit_size_] & (size_t(1) << (index % cell_bit_size_))) != 0;
- }
- private:
- std::vector<size_t> bitset_;
- size_t size_;
- static const unsigned int cell_bit_size_ = CHAR_BIT * sizeof(size_t);
- };
- } // namespace cvflann
- #endif
- #endif // OPENCV_FLANN_DYNAMIC_BITSET_H_
|