libloot's C++ implementation is licensed under the GPL v3.0 or later, not v3.0 only, so carry the same into the Rust reimplementation and its dependent crates.
To prevent inconsistencies between the C++ and Rust regex implementations. This does mean a boxed copy of the PluginMetadata object is made for each call, but fortunately LOOT doesn't actually make any calls to NameMatches().
To prevent inconsistencies between implementations. This means allocating new boxed Filenames for each comparison, but an extra string copy is avoided by making the C++ operators friends of the C++ class (which is ABI-safe).