/usr/include/tjutils/tjindex.h is in libodin-dev 1.8.5-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | /***************************************************************************
tjindex.h - description
-------------------
begin : Tue Aug 13 2002
copyright : (C) 2001 by Thies H. Jochimsen
email : jochimse@cns.mpg.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef TJINDEX_H
#define TJINDEX_H
#include <tjutils/tjutils.h>
#include <tjutils/tjstatic.h>
#include <tjutils/tjlabel.h>
#include <tjutils/tjhandler.h>
/**
* @addtogroup tjutils
* @{
*/
class Index {
public:
static const char* get_compName();
};
//////////////////////////////////////////////////////////
// mapping between UniquIndex types and typenames
struct UniqueIndexMap : public STD_map<STD_string, STD_list<unsigned int> >, public Labeled {
unsigned int get_index(STD_list<unsigned int>::iterator& index, const STD_string& type, unsigned int max_instances);
void remove_index(const STD_list<unsigned int>::iterator& index, const STD_string& type);
private:
bool contiguous; // cache whether list of indices is contiguous for fast assignment of indices
unsigned int assign_index(STD_list<unsigned int>::iterator& index, const STD_string& type); // Get the next lowest index which is available
};
//////////////////////////////////////////////////////////
// keeps track of all index lists
class UniqueIndexBase : public StaticHandler<UniqueIndexBase> {
public:
// for StaticHandler
static void init_static() {indices_map.init("indices_map");}
static void destroy_static() {indices_map.destroy();}
protected:
UniqueIndexBase() {} // Use only as base class
static SingletonHandler<UniqueIndexMap,true> indices_map; // global lists of indices
};
//////////////////////////////////////////////////////////
/**
* This template class provides a unique index, i.e. an unique
* unsigned integer number for all instances of the (derived) class.
* A new index for the object is created whenever a call to 'get_index()'
* is issued the first time. The assigned index is removed from the list
* of assigned indices if the object is destroyed.
* Please note that the index of temporary objects is deleted from
* the list of indices, even it is assigned to another object.
* The class T must have two static member functions, 'get_typename()'
* and 'get_max_instances()' to return a unique label and the
* maximum number of instances per class, respectively.
*/
template<class T>
class UniqueIndex : public UniqueIndexBase {
public:
UniqueIndex() {init();}
UniqueIndex(const UniqueIndex<T>&) {init();}
UniqueIndex<T>& operator = (const UniqueIndex<T>&) {erase(); init(); return *this;}
~UniqueIndex() {erase();}
/**
* Returns a unique index for this object.
*/
unsigned int get_index() const {
return indices_map->get_index(index, T::get_typename(), T::get_max_instances());
}
private:
void init() { // Start with unassigned index (pointing to end())
index=indices_map->operator[](T::get_typename()).end();
}
void erase() { // Remove index
indices_map->remove_index(index, T::get_typename());
}
mutable STD_list<unsigned int>::iterator index;
};
/** @}
*/
#endif
|