blob: b7185ab34e2e83c8731938d294fecc840779d222 [file] [log] [blame]
Maintainer C++ Namespace Notes
Namespaces have been employed to help organize source and push all private
symbols (those which are not part of the public C API) to a location
that is unlikely to be accidentally used by anyone. It also virtually
eliminates any chance that private impl symbols will cause symbol collisions
at compile or link-time.
The global namespace is used by C API which generally prefixes all
of its symobls with MP4 to avoid collisions. This space is used by
src/mp4.cpp and include/mp4v2/mp4v2.h . A few exceptions may exist where
additional API is exported from some differently-implemented code.
The rest of the codebase is tucked into various child-namespaces of
the project's top-level 'mp4v2' namespace. The top-level namespace
is reserved for this project, and unless someone branches our codebase
and ignores their moral responsibility to rename their root namespace,
we should neatly avoid symbol collisions. Code external to the project
should never use any symbols which reside in mp4v2.
The namespace 'mp4v2::platform' is private and used for code which abstracts
various plaform differences or implements missing features.
The namespace 'mp4v2::impl' is a private namespace for the main
implementation of libmp4v2. This namespace generally depends on
mp4v2::platform .
The namespace 'mp4v2::util' is a private namespace which adds
functionality for use with libutil and util/ command-line tools. The
positioning is a little more complicated in that it has symbols which
are exported from libmp4v2, which needs full access to mp4v2::impl
hidden symbols. Then libutil itself adds to the same namespace, but
because libutil does not require direct access to mp4v2::impl hidden
symbols it is a separate static library. And finally, the util/ tools
themselves use the namespace for implementation convenience.
Nested (child) namespaces of those listed above are used for further
organization when applicable.
Further documentation is available in the API Reference;
see Namespaces section.