Merge branch 'master' of github.com:openSUSE/libzypp
[platform/upstream/libzypp.git] / zypp / sat / Map.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Map.h
10  */
11 #ifndef ZYPP_SAT_MAP_H
12 #define ZYPP_SAT_MAP_H
13
14 extern "C"
15 {
16   struct _Map;
17 }
18 #include <iosfwd>
19 #include <string>
20
21 #include "zypp/base/PtrTypes.h"
22
23 ///////////////////////////////////////////////////////////////////
24 namespace zypp
25 {
26   ///////////////////////////////////////////////////////////////////
27   namespace sat
28   {
29     ///////////////////////////////////////////////////////////////////
30     /// \class Map
31     /// \brief Libsolv (bit)Map wrapper.
32     ///
33     /// \Note Requested sizes are filled up to the next multiple of eight.
34     /// Libsolv bitmaps are not shrinkable.
35     ///////////////////////////////////////////////////////////////////
36     class Map
37     {
38     public:
39       typedef unsigned long size_type;
40
41     public:
42       /** Default ctor: empty Map */
43       Map();
44
45       /** Ctor taking the Map size */
46       explicit Map( size_type size_r );
47
48       /** Dtor */
49       ~Map();
50
51     public:
52       /** Whether Map is empty. */
53       bool empty() const;
54
55       /** Size of the Map. */
56       size_type size() const;
57
58       /** Grow the Map if necessary. */
59       void grow( size_type size_r );
60
61     public:
62       /** Set all bits. */
63       void setAll();
64
65       /** Clear all bits. */
66       void clearAll();
67
68       /** Assign \c val_r to all bits. */
69       void assignAll( bool val_r );
70
71       /** Set bit \c idx_r. */
72       void set( size_type idx_r );
73
74       /** Clear bit \c idx_r. */
75       void clear( size_type idx_r );
76
77       /** Assign \c val_r to bit \c idx_r. */
78       void assign( size_type idx_r, bool val_r );
79
80     public:
81       /** Test bit \c idx_r.*/
82       bool test( size_type idx_r ) const;
83
84       /** Test bit \c idx_r.*/
85       bool operator[]( size_type idx_r ) const
86       { return test( idx_r ); }
87
88     public:
89       /** String representation */
90       std::string asString( const char on_r = '1', const char off_r = '0' ) const;
91
92     public:
93       operator struct ::_Map *();               ///< libsolv backdoor
94       operator const struct ::_Map *() const    ///< libsolv backdoor
95       { return _pimpl.get(); }
96     private:
97       RWCOW_pointer<struct ::_Map> _pimpl;      ///< Pointer to implementation
98     };
99
100     /** \relates Map Stream output */
101     inline std::ostream & operator<<( std::ostream & str, const Map & obj )
102     { return str << obj.asString(); }
103
104     /** \relates Map */
105     bool operator==( const Map & lhs, const Map & rhs );
106
107     /** \relates Map */
108     inline bool operator!=( const Map & lhs, const Map & rhs )
109     { return !( lhs == rhs ); }
110
111   } // namespace sat
112   ///////////////////////////////////////////////////////////////////
113
114   /** \relates Map Clone function for RWCOW_pointer */
115   template<> struct ::_Map * rwcowClone<struct ::_Map>( const struct ::_Map * rhs );
116
117 } // namespace zypp
118 ///////////////////////////////////////////////////////////////////
119 #endif // ZYPP_SAT_MAP_H