* Since these types are more prevalent than originally designed, it
makes more sense to remove the namespace for ease of typing/naming.
* Also add a specialised type 'bytebuf' for an array of bytes.
* This makes mapping easier to SWIG since there's no special casing for
namespaced arrays. Especially so for nested cases like
rdctype::array<rdctype::str> -> rdcarray<rdcstr>
* For the most part the interface is stl-compatible, but we have a few
little changes of our own for convenience.
* This class is still needed after deleting the C# UI, because we don't
want to pass C++ stl structs over module boundaries and possibly run
into hard to diagnose incompatibilities.
* The directories are flattened since the #include paths aren't
relative and instead just #include "file.h". The recommended
solution is just to flatten the directory structure.
* This can happen if the resource was not included in the capture, but
there was a descriptor passed (i.e. not NULL desc which is handled
separately) which specifies some parameters, but leaves the format
as UNKNOWN.
* This includes several fixes notably arm/aarch64 support. Although it's
unlikely to be used in practice it's useful to be able to compile
successfully.
* Not doing this could taint the state and even cause invalid read-write
conflicts to change bindings vs. what should happen, if a RT is left
bound when it shouldn't, and then an SRV is bound as NULL because it
would conflict.
To quote the Qt documentation for QFileDialog::setNameFilters:
> Note that the filter *.* is not portable, because the historical
> assumption that the file extension determines the file type is not
> consistent on every operating system. It is possible to have a file
> with no dot in its name (for example, Makefile). In a native Windows
> file dialog, *.* will match such files, while in other types of file
> dialogs it may not. So it is better to use * if you mean to select
> any file.
Admittedly, one of these usages is Windows-only and we are using the
native file dialog there, but we might as well be consistent.
Instead of manually specifying the default extension, just grab the
first one from each filter. We can only specify one at a time, so
update it whenever the selected filter changes.