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"
24 ///////////////////////////////////////////////////////////////////
26 { /////////////////////////////////////////////////////////////////
29 struct ::_Map * rwcowClone<struct ::_Map>( const struct ::_Map * rhs )
31 struct ::_Map * ret = new ::_Map;
32 ::map_init_clone( ret, const_cast<struct ::_Map *>(rhs) );
36 ///////////////////////////////////////////////////////////////////
38 { /////////////////////////////////////////////////////////////////
41 : _pimpl( new ::_Map )
42 { ::map_init( _pimpl.get(), 0 ); }
44 Map::Map( size_type size_r )
45 : _pimpl( new ::_Map )
46 { ::map_init( _pimpl.get(), size_r ); }
49 { ::map_free( _pimpl.get() ); }
51 bool Map::empty() const
52 { return( _pimpl->size == 0 ); }
54 Map::size_type Map::size() const
55 { return _pimpl->size << 3; }
57 void Map::grow( size_type size_r )
58 { ::map_grow( _pimpl.get(), size_r ); }
61 { assignAll( true ); }
64 { assignAll( false ); }
66 void Map::assignAll( bool val_r )
69 ::memset( _pimpl->map, (val_r?-1:0), _pimpl->size );
72 #define M_RANGE_CKECK(IDX,LOC) if ( ((IDX) >> 3) >= _pimpl->size ) throw std::out_of_range( "zypp::sat::Map::" LOC )
74 void Map::set( size_type idx_r )
76 M_RANGE_CKECK( idx_r, "set" );
77 MAPSET( _pimpl, idx_r );
80 void Map::clear( size_type idx_r )
82 M_RANGE_CKECK( idx_r, "clear" );
83 MAPCLR( _pimpl, idx_r );
86 void Map::assign( size_type idx_r, bool val_r )
88 M_RANGE_CKECK( idx_r, "assign" );
90 { MAPSET( _pimpl, idx_r ); }
92 { MAPCLR( _pimpl, idx_r ); }
95 bool Map::test( size_type idx_r ) const
97 M_RANGE_CKECK( idx_r, "test" );
98 return MAPTST( _pimpl, idx_r );
101 std::string Map::asString( const char on_r, const char off_r ) const
104 return std::string();
106 std::string ret( size(), off_r );
107 for_( idx, size_type(0), size() )
115 Map::operator struct ::_Map *() // COW: nonconst version can't be inlined
116 { return _pimpl.get(); } // without exposing struct ::_Map
118 bool operator==( const Map & lhs, const Map & rhs )
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 ) );
125 /////////////////////////////////////////////////////////////////
127 ///////////////////////////////////////////////////////////////////
128 /////////////////////////////////////////////////////////////////
130 ///////////////////////////////////////////////////////////////////