vcl_bvector.h

来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C头文件 代码 · 共 503 行 · 第 1/2 页

H
503
字号
/*
 *
 * Copyright (c) 1994
 * Hewlett-Packard Company
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Hewlett-Packard Company makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 *
 * Copyright (c) 1996
 * Silicon Graphics Computer Systems, Inc.
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Silicon Graphics makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 * Copyright (c) 1997
 * Moscow Center for SPARC Technology
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Moscow Center for SPARC Technology makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied warranty.
 *
 */

// vcl_vector<bool> is replaced by vcl_bit_vector at present because partial
// specialization is not yet implemented.

#ifndef vcl_emulation_bvector_h
#define vcl_emulation_bvector_h

#include <vcl_cstddef.h>
#include "vcl_algobase.h"
#include "vcl_alloc.h"

#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int)))

// fbp : give a chance to overload vcl_allocator
# if ! defined ( Alloc )
#  define __AUTO_BVEC_ALLOC
#  define Alloc vcl_alloc
# endif

class __bvec_iterator;
class __bvec_const_iterator;

class __bvec_reference {
    friend class __bvec_iterator;
    friend class __bvec_const_iterator;
    typedef __bvec_reference reference;
protected:
    unsigned int* p;
    unsigned int mask;
    __bvec_reference(unsigned int* x, unsigned int y) : p(x), mask(y) {}
public:
    __bvec_reference() : p(0), mask(0) {}
    operator bool() const { return !(!(*p & mask)); }
    reference& operator=(bool x) {
        if (x)
            *p |= mask;
        else
            *p &= ~mask;
        return *this;
    }
    reference& operator=(const reference& x) { return *this = bool(x); }
    bool operator==(const reference& x) const {
        return bool(*this) == bool(x);
    }
    bool operator<(const reference& x) const {
        return ! bool(*this) && bool(x); // was: bool(*this) < bool(x);
    }
    void flip() { *p ^= mask; }
};


class __bvec_iterator {
    friend class vcl_bit_vector;
    friend class __bvec_const_iterator;
    typedef __bvec_iterator iterator;
    typedef __bvec_const_iterator const_iterator;
    typedef __bvec_reference reference;
    typedef bool const_reference;
    typedef bool value_type;
    typedef vcl_ptrdiff_t difference_type;
    typedef vcl_size_t size_type;
protected:
    unsigned int* p;
    unsigned int offset;
    void bump_up() {
        if (offset++ == __WORD_BIT - 1) {
            offset = 0;
            ++p;
        }
    }
    void bump_down() {
        if (offset-- == 0) {
            offset = __WORD_BIT - 1;
            --p;
        }
    }
public:
    __bvec_iterator() : p(0), offset(0) {}
    __bvec_iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {}
    reference operator*() const { return reference(p, 1U << offset); }
    iterator& operator++() {
        bump_up();
        return *this;
    }
    iterator operator++(int) {
        iterator tmp = *this;
        bump_up();
        return tmp;
    }
    iterator& operator--() {
        bump_down();
        return *this;
    }
    iterator operator--(int) {
        iterator tmp = *this;
        bump_down();
        return tmp;
    }
    iterator& operator+=(difference_type i) {
        difference_type n = i + offset;
        p += n / __WORD_BIT;
        n = n % __WORD_BIT;
        if (n < 0) {
            offset = n + __WORD_BIT;
            --p;
        } else
            offset = n;
        return *this;
    }
    iterator& operator-=(difference_type i) {
        *this += -i;
        return *this;
    }
    iterator operator+(difference_type i) const {
        iterator tmp = *this;
        return tmp += i;
    }
    iterator operator-(difference_type i) const {
        iterator tmp = *this;
        return tmp -= i;
    }
    difference_type operator-(iterator x) const {
        return __WORD_BIT * (p - x.p) + offset - x.offset;
    }
    reference operator[](difference_type i) { return *(*this + i); }
    bool operator==(const iterator& x) const {
        return p == x.p && offset == x.offset;
    }
    bool operator!=(const iterator& x) const {
        return p != x.p || offset != x.offset;
    }
    bool operator<(iterator x) const {
        return p < x.p || (p == x.p && offset < x.offset);
    }
};

class __bvec_const_iterator
{
    friend class vcl_bit_vector;
    typedef __bvec_iterator iterator;
    typedef __bvec_const_iterator const_iterator;
    typedef __bvec_reference reference;
    typedef bool value_type;
    typedef bool const_reference;
    typedef vcl_ptrdiff_t difference_type;
    typedef vcl_size_t size_type;
protected:
    unsigned int* p;
    unsigned int offset;
    void bump_up() {
        if (offset++ == __WORD_BIT - 1) {
            offset = 0;
            ++p;
        }
    }
    void bump_down() {
        if (offset-- == 0) {
            offset = __WORD_BIT - 1;
            --p;
        }
    }
public:
    __bvec_const_iterator() : p(0), offset(0) {}
    __bvec_const_iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {}
    __bvec_const_iterator(const iterator& x) : p(x.p), offset(x.offset) {}
    const_reference operator*() const {
        return reference(p, 1U << offset);
    }
    const_iterator& operator++() {
        bump_up();
        return *this;
    }
    const_iterator operator++(int) {
        const_iterator tmp = *this;
        bump_up();
        return tmp;
    }
    const_iterator& operator--() {
        bump_down();
        return *this;
    }
    const_iterator operator--(int) {
        const_iterator tmp = *this;
        bump_down();
        return tmp;
    }
    const_iterator& operator+=(difference_type i) {
        difference_type n = i + offset;
        p += n / __WORD_BIT;
        n = n % __WORD_BIT;
        if (n < 0) {
            offset = n + __WORD_BIT;
            --p;
        } else
            offset = n;
        return *this;
    }
    const_iterator& operator-=(difference_type i) {
        *this += -i;
        return *this;
    }
    const_iterator operator+(difference_type i) const {
        const_iterator tmp = *this;
        return tmp += i;
    }
    const_iterator operator-(difference_type i) const {
        const_iterator tmp = *this;
        return tmp -= i;
    }
    difference_type operator-(const_iterator x) const {
        return __WORD_BIT * (p - x.p) + offset - x.offset;
    }
    const_reference operator[](difference_type i) {
        return *(*this + i);
    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?