| 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_
 |