/* -*- mode: C++; indent-tabs-mode: nil; -*-
* This file is a part of LEMON, a generic C++ optimization library.
* Copyright (C) 2003-2011
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
* (Egervary Research Group on Combinatorial Optimization, EGRES).
* Permission to use, modify and distribute this software is granted
* provided that this copyright notice appears in all copies. For
* precise terms see the accompanying LICENSE file.
* This software is provided "AS IS" with no warranty of any kind,
* express or implied, and with no claim as to its suitability for any
#ifndef LEMON_BITS_SOLVER_BITS_H
#define LEMON_BITS_SOLVER_BITS_H
std::vector<ItemT> items;
int first_item, last_item, first_free_item;
: first_item(-1), last_item(-1), first_free_item(-1) {
if (first_free_item == -1) {
items.push_back(ItemT());
first_free_item = items[n].next;
if (first_free_item != -1) {
items[first_free_item].prev = -1;
if (static_cast<int>(cross.size()) <= idx) {
cross.resize(idx + 1, -1);
items[n].prev = last_item;
items[last_item].next = n;
int addIndex(int idx, int n) {
while (n >= static_cast<int>(items.size())) {
items.push_back(ItemT());
items.back().next = first_free_item;
if (first_free_item != -1) {
items[first_free_item].prev = items.size() - 1;
first_free_item = items.size() - 1;
if (items[n].next != -1) {
items[items[n].next].prev = items[n].prev;
if (items[n].prev != -1) {
items[items[n].prev].next = items[n].next;
first_free_item = items[n].next;
if (static_cast<int>(cross.size()) <= idx) {
cross.resize(idx + 1, -1);
items[n].prev = last_item;
items[last_item].next = n;
void eraseIndex(int idx) {
if (items[n].prev != -1) {
items[items[n].prev].next = items[n].next;
first_item = items[n].next;
if (items[n].next != -1) {
items[items[n].next].prev = items[n].prev;
last_item = items[n].prev;
if (first_free_item != -1) {
items[first_free_item].prev = n;
items[n].next = first_free_item;
while (!cross.empty() && cross.back() == -1) {
void shiftIndices(int idx) {
for (int i = idx + 1; i < static_cast<int>(cross.size()); ++i) {
while (!cross.empty() && cross.back() == -1) {
void relocateIndex(int idx, int jdx) {
items[cross[jdx]].index = idx;
while (!cross.empty() && cross.back() == -1) {
int operator[](int idx) const {
int operator()(int fdx) const {
void firstItem(int& fdx) const {
void nextItem(int& fdx) const {