Merge branch 'master' of github.com:openSUSE/libzypp
[platform/upstream/libzypp.git] / zypp / sat / Map.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Map.cc
10  */
11 extern "C"
12 {
13 #include <solv/bitmap.h>
14 }
15 #include <iostream>
16 #include <exception>
17 #include "zypp/base/LogTools.h"
18 #include "zypp/base/String.h"
19
20 #include "zypp/sat/Map.h"
21
22 using std::endl;
23
24 ///////////////////////////////////////////////////////////////////
25 namespace zypp
26 { /////////////////////////////////////////////////////////////////
27
28   template<>
29   struct ::_Map * rwcowClone<struct ::_Map>( const struct ::_Map * rhs )
30   {
31     struct ::_Map * ret = new ::_Map;
32     ::map_init_clone( ret, const_cast<struct ::_Map *>(rhs) );
33     return ret;
34   }
35
36   ///////////////////////////////////////////////////////////////////
37   namespace sat
38   { /////////////////////////////////////////////////////////////////
39
40     Map::Map()
41       : _pimpl( new ::_Map )
42     { ::map_init( _pimpl.get(), 0 ); }
43
44     Map::Map( size_type size_r )
45       : _pimpl( new ::_Map )
46     { ::map_init( _pimpl.get(), size_r ); }
47
48     Map::~Map()
49     { ::map_free( _pimpl.get() ); }
50
51     bool Map::empty() const
52     { return( _pimpl->size == 0 ); }
53
54     Map::size_type Map::size() const
55     { return _pimpl->size << 3; }
56
57     void Map::grow( size_type size_r )
58     { ::map_grow( _pimpl.get(), size_r ); }
59
60     void Map::setAll()
61     { assignAll( true ); }
62
63     void Map::clearAll()
64     { assignAll( false ); }
65
66     void Map::assignAll( bool val_r )
67     {
68       if ( _pimpl->size )
69         ::memset( _pimpl->map, (val_r?-1:0), _pimpl->size );
70     }
71
72 #define M_RANGE_CKECK(IDX,LOC) if ( ((IDX) >> 3) >= _pimpl->size ) throw std::out_of_range( "zypp::sat::Map::" LOC )
73
74     void Map::set( size_type idx_r )
75     {
76       M_RANGE_CKECK( idx_r, "set" );
77       MAPSET( _pimpl, idx_r );
78     }
79
80     void Map::clear( size_type idx_r )
81     {
82       M_RANGE_CKECK( idx_r, "clear" );
83       MAPCLR( _pimpl, idx_r );
84     }
85
86     void Map::assign( size_type idx_r, bool val_r )
87     {
88       M_RANGE_CKECK( idx_r, "assign" );
89       if ( val_r )
90       { MAPSET( _pimpl, idx_r ); }
91       else
92       { MAPCLR( _pimpl, idx_r ); }
93     }
94
95     bool Map::test( size_type idx_r ) const
96     {
97       M_RANGE_CKECK( idx_r, "test" );
98       return MAPTST( _pimpl, idx_r );
99     }
100
101     std::string Map::asString( const char on_r, const char off_r ) const
102     {
103       if ( empty() )
104         return std::string();
105
106       std::string ret( size(), off_r );
107       for_( idx, size_type(0), size() )
108       {
109         if ( test( idx ) )
110           ret[idx] = on_r;
111       }
112       return ret;
113     }
114
115     Map::operator struct ::_Map *()     // COW: nonconst version can't be inlined
116     { return _pimpl.get(); }            // without exposing struct ::_Map
117
118     bool operator==( const Map & lhs, const Map & rhs )
119     {
120       const struct ::_Map * l = lhs;
121       const struct ::_Map * r = rhs;
122       return( l == r || ( l->size == r->size && ::memcmp( l->map, r->map, l->size ) == 0 ) );
123     }
124
125     /////////////////////////////////////////////////////////////////
126   } // namespace sat
127   ///////////////////////////////////////////////////////////////////
128   /////////////////////////////////////////////////////////////////
129 } // namespace zypp
130 ///////////////////////////////////////////////////////////////////