OVH Cloud OVH Cloud

Boost.Regex

1 réponse
Avatar
Vladimir Votiakov
Bonjour à tous,

Quelqu'un peut me mettre sur une piste :

Comment peut-on utiliser la lib Boost.Regex sur un buffer
en mémoire dont on connaît la taille,
typiquement un fichier mappé en mémoire (memory mapped file)
sans le copier dans une string (trop facile).

Il est fort souhaitable que ça soit une solution dans l'esprit de la STL.

Je vois vaguement un stream quelconque...

vlad

1 réponse

Avatar
James Kanze
"Vladimir Votiakov" writes:

|> Quelqu'un peut me mettre sur une piste :

|> Comment peut-on utiliser la lib Boost.Regex sur un buffer en
|> mémoire dont on connaît la taille, typiquement un fichier
|> mappé en mémoire (memory mapped file) sans le copier dans une
|> string (trop facile).

|> Il est fort souhaitable que ça soit une solution dans l'esprit de la STL.

|> Je vois vaguement un stream quelconque...

Au contraire. Les expressions rationnelles de Boost cherchent dans un
intervalle défini par des itérateurs bidirectionnels STL ; il ne
peuvent donc pas travailler sur des flux. En revanche, un tableau de
type C (et donc, un fichier mappé mémoire), c'est bien une
collection STL qui supporte des itérateurs aléatoires (et donc
bidirectionnels). Par exemple :

class FileContents
{
public:
typedef char value_type ;
typedef char* iterator ;
typedef char const* const_iterator ;
// Et les autres...

FileContents( std::string const& name ) ;
iterator begin() ;
iterator end() ;
const_iterator begin() const ;
const_iteartor end() const ;
// ...

private:
char* myBegin ;
char* myEnd ;
} ;

FileContents::FileContents(
std::string const& name )
: myBegin( NULL )
, myEnd( NULL )
{
int fd = ::open( name.c_str(), O_RDWR ) ;
if ( fd == -1 ) {
throw uneErreurQuelconque( ... ) ;
}
off_t size = getSize( fd ) ;
void* tmp = mmmap( ... ) ;
if ( tmp == MMAP_ERROR ) {
throw uneErreurQuelconque( ... ) ;
}
myBegin = static_cast< char* >( tmp ) ;
myEnd = myBegin + size ;
}

char*
FileContents::begin()
{
return myBegin ;
}

char*
FileContents::end()
{
return myEnd ;
}

// ...

(En passant, je suis curieux pourquoi il leur faut un itérateur
bi-directionnel. J'aurais cru qu'un itérateur forward aurait suffit.)

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93