1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/Map.cc
13 #include <solv/bitmap.h>
17 #include "zypp/base/LogTools.h"
18 #include "zypp/base/String.h"
20 #include "zypp/sat/Map.h"
21 #include "zypp/sat/Pool.h"
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
30 struct ::_Map * rwcowClone<struct ::_Map>( const struct ::_Map * rhs )
32 struct ::_Map * ret = new ::_Map;
33 ::map_init_clone( ret, const_cast<struct ::_Map *>(rhs) );
37 ///////////////////////////////////////////////////////////////////
39 { /////////////////////////////////////////////////////////////////
42 : _pimpl( new ::_Map )
43 { ::map_init( _pimpl.get(), 0 ); }
45 Map::Map( size_type size_r )
46 : _pimpl( new ::_Map )
47 { ::map_init( _pimpl.get(), size_r ); }
49 Map::Map( PoolSizeType )
50 : _pimpl( new ::_Map )
51 { ::map_init( _pimpl.get(), Pool::instance().capacity() ); }
54 { ::map_free( _pimpl.get() ); }
56 bool Map::empty() const
57 { return( _pimpl->size == 0 ); }
59 Map::size_type Map::size() const
60 { return _pimpl->size << 3; }
62 void Map::grow( size_type size_r )
63 { ::map_grow( _pimpl.get(), size_r ); }
66 { assignAll( true ); }
69 { assignAll( false ); }
71 void Map::assignAll( bool val_r )
74 ::memset( _pimpl->map, (val_r?-1:0), _pimpl->size );
77 #define M_RANGE_CKECK(IDX,LOC) if ( ((IDX) >> 3) >= size_type(_pimpl->size) ) throw std::out_of_range( "zypp::sat::Map::" LOC )
79 void Map::set( size_type idx_r )
81 M_RANGE_CKECK( idx_r, "set" );
82 MAPSET( _pimpl, idx_r );
85 void Map::clear( size_type idx_r )
87 M_RANGE_CKECK( idx_r, "clear" );
88 MAPCLR( _pimpl, idx_r );
91 void Map::assign( size_type idx_r, bool val_r )
93 M_RANGE_CKECK( idx_r, "assign" );
95 { MAPSET( _pimpl, idx_r ); }
97 { MAPCLR( _pimpl, idx_r ); }
100 bool Map::test( size_type idx_r ) const
102 M_RANGE_CKECK( idx_r, "test" );
103 return MAPTST( _pimpl, idx_r );
106 std::string Map::asString( const char on_r, const char off_r ) const
109 return std::string();
111 std::string ret( size(), off_r );
112 for_( idx, size_type(0), size() )
120 Map::operator struct ::_Map *() // COW: nonconst version can't be inlined
121 { return _pimpl.get(); } // without exposing struct ::_Map
123 bool operator==( const Map & lhs, const Map & rhs )
125 const struct ::_Map * l = lhs;
126 const struct ::_Map * r = rhs;
127 return( l == r || ( l->size == r->size && ::memcmp( l->map, r->map, l->size ) == 0 ) );
130 /////////////////////////////////////////////////////////////////
132 ///////////////////////////////////////////////////////////////////
133 /////////////////////////////////////////////////////////////////
135 ///////////////////////////////////////////////////////////////////