From e379ad82c65dae8b169a9c8fd77e9dffbf21d08d Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 2 Dec 2017 03:03:56 +0100 Subject: [PATCH] Library: typeof obsoleted by decltype Replace the remaining usages of the GNU extension 'typeof()' by the now-standard 'decltype()' operator --- doc/technical/build/Dependencies.txt | 3 +- src/proc/mobject/output-designation.hpp | 12 ++-- src/proc/mobject/output-mapping.hpp | 67 ++++++++++--------- .../core/proc/mobject/output-mapping-test.cpp | 2 +- tests/library/format-cout-test.cpp | 14 ++-- tests/library/meta/type-display-test.cpp | 4 +- 6 files changed, 52 insertions(+), 50 deletions(-) diff --git a/doc/technical/build/Dependencies.txt b/doc/technical/build/Dependencies.txt index 0dc06f3e2..29b6b16c1 100644 --- a/doc/technical/build/Dependencies.txt +++ b/doc/technical/build/Dependencies.txt @@ -58,7 +58,8 @@ Languages and Tools occasionally we check using Clang] - GCC *4.9* or Clang *3.5* should be fine footnote:[basically we try to use just the stock language. On rare occasions in the past, we _did_ use some GCC extensions, like `typeof()`, but we care for - workarounds, in case this becomes a problem]. + workarounds, in case this becomes a problem. Incidentally, `typeof()` is obsoleted by the new + C++ standard, which provides `decltype()` for this purpose.]. * BOOST (listed below are the Debian package names) - libboost-dev (at least *1.55*) diff --git a/src/proc/mobject/output-designation.hpp b/src/proc/mobject/output-designation.hpp index c9469bdf8..ccbf18b55 100644 --- a/src/proc/mobject/output-designation.hpp +++ b/src/proc/mobject/output-designation.hpp @@ -80,11 +80,11 @@ namespace mobject { class OutputDesignation { public: - typedef asset::ID PID; - typedef asset::PPipe PPipe; + using PID = asset::ID; + using PPipe = asset::PPipe; explicit OutputDesignation (PID explicitTarget); - explicit OutputDesignation (RefPlacement const& indirectTarget); + explicit OutputDesignation (RefPlacement const& indirectTarget); explicit OutputDesignation (uint relative_busNr =0); // using default copying @@ -93,8 +93,8 @@ namespace mobject { /** retrieve the direct destination * this descriptor is actually pointing to. * In case of a target pipe not explicitly specified - * this might involve a resolution step and take the - * current context into account. + * this might involve a resolution step and take the + * current context into account. * @param origin starting point for figuring out connections * @return a pipe-ID, which should be used as next connection. * This might not be the final designation, but the @@ -121,7 +121,7 @@ namespace mobject { { VTABLE = sizeof(size_t) , SPEC_SIZ = VTABLE + mp::maxSize< - mp::Types< PID, lumiera_uid, uint>::List>::value + mp::Types< PID, lumiera_uid, uint>::List>::value }; typedef lib::OpaqueHolder SpecBuff; diff --git a/src/proc/mobject/output-mapping.hpp b/src/proc/mobject/output-mapping.hpp index 5667c2002..d9e480b0b 100644 --- a/src/proc/mobject/output-mapping.hpp +++ b/src/proc/mobject/output-mapping.hpp @@ -40,7 +40,7 @@ ** values, which typically are interpreted as asset::ID. ** But the actual mapping result is retrieved on each access ** by invoking a functor on the stored hash value, - ** thus the final resolution is done \em late. + ** thus the final resolution is done _late_. ** ** @see OutputDesignation ** @see OutputMapping_test @@ -68,7 +68,7 @@ namespace mobject { namespace { // Helper to extract and rebind definition types - /** + /** * @internal used by OutputMapping * to figure out the mapping target type */ @@ -86,11 +86,11 @@ namespace mobject { typedef RET Res; }; - typedef typeof(&DEF::output) OutputMappingMemberFunc; // GCC extension: "typeof" - typedef Rebind Rebinder; + using OutputMappingMemberFunc = decltype(&DEF::output) ; + using Rebinder = Rebind; public: - typedef typename Rebinder::Res Target; + using Target = typename Rebinder::Res; }; }//(End) type rebinding helper @@ -111,7 +111,7 @@ namespace mobject { * may be derived by querying the OutputMapping. Here, the kind of * the target specification is defined through the type parameter. * - * \par definition of specific mapping behaviour + * ## definition of specific mapping behaviour * * This is an generic map-like container, acting as Interface to be used * in the signature of API functions either providing or requiring a Mapping. @@ -119,11 +119,12 @@ namespace mobject { * be created, providing a definition context as template parameter. * Instances of this concrete mapping type may then be default constructed * and copied freely. The definition context is supposed to provide - * - a functor \c DEF::output usable as function pipe-ID --> Target + * - a functor `DEF::output` usable as function pipe-ID --> Target * - the concrete output-functor also defines the concrete Target type, * which will be returned when accessing the OutputMapping - * - a function \c DEF::buildQuery(sourcePipeID,seqNr) yielding a (defaults) + * - a function `DEF::buildQuery (sourcePipeID,seqNr)` yielding a (defaults) * query to be issued in case of accessing a non existent mapping + * @tparam DEF static (compile-time) definition/configuration context */ template class OutputMapping @@ -131,14 +132,14 @@ namespace mobject { { typedef _def Setup; - typedef asset::ID PId; - typedef asset::PPipe PPipe; + using PId = asset::ID; + using PPipe = asset::PPipe; /* == mapping table storage == */ std::map table_; public: - typedef typename Setup::Target Target; + using Target = typename Setup::Target; // using default ctor and copy operations @@ -153,7 +154,7 @@ namespace mobject { * It is created on the stack by the OutputMapping container and internally wired * back to the container and the actually stored value (pipe-ID-hash) in the table. * Actually retrieving the result value by the client code triggers invocation - * of the specific resolution functor, embedded in the definition context DEF, + * of the specific resolution functor, embedded in the definition context `DEF`, * which was given when instantiating the OutputMapping template. * @note depends on the template parameter of the enclosing OutputMapping type! */ @@ -186,7 +187,7 @@ namespace mobject { public: /** explicitly define a new target ID for this individual mapping * @note the actually returned result depends on what the configured - * \c DEF::output functor will yield when invoked on this ID + * `DEF::output` functor will yield when invoked on this ID */ void operator= (PId newId2map) @@ -209,13 +210,13 @@ namespace mobject { /** actually retrieve the target object of the mapping. * This operation is invoked when client code accesses - * the result of an OutputMapping query. - * @return result of invoking the configured \c DEF::output functor - * @throw error::Logic when resolving an \em unconnected mapping + * the result of an OutputMapping query. + * @return result of invoking the configured `DEF::output` functor + * @throw error::Logic when resolving an _unconnected_ mapping */ operator Target() { - if (!isValid()) + if (not isValid()) throw error::Logic ("attempt to resolve an unconnected output mapping" , error::LUMIERA_ERROR_UNCONNECTED); return resolve(); @@ -239,13 +240,13 @@ namespace mobject { friend bool operator== (Resolver const& a, Resolver const& b) { - return a.pID_ == b.pID_; + return a.pID_ == b.pID_; } // note: Resolver depends on template parameter DEF // All instances of DEF are considered equivalent! friend bool operator== (Resolver const& rr, Target const& tval) { - return rr.resolve() == tval; + return rr.resolve() == tval; } }; @@ -267,7 +268,7 @@ namespace mobject { contains (PPipe sourcePipe) { return !sourcePipe - || this->contains (sourcePipe->getID()); + or this->contains (sourcePipe->getID()); } @@ -327,7 +328,7 @@ namespace mobject { inline typename OutputMapping::Resolver OutputMapping::operator[] (PId sourcePipeID) { - if (!contains (sourcePipeID)) + if (not contains (sourcePipeID)) { // issue a defaults query to resolve this mapping first Query query4pipe = DEF::buildQuery (sourcePipeID); @@ -352,29 +353,29 @@ namespace mobject { * instead of just picking a mapped pipe (which is the default usage). * Accessing the OutputMapping this way by query enables all kinds of * extended usages: It suffices that the given query somehow yields a Pipe, - * which then is considered the mapped result and handed over to the \c DEF::output + * which then is considered the mapped result and handed over to the `DEF::output` * functor for resolution to a result object to be returned. * - * \par Query for the Nth default instance + * ## Query for the Nth default instance * OutputMapping provides a special behaviour for retrieving "the Nth default pipe". * The rationale being the request for connection to the Nth bus of a given kind, like * e.g. the 3rd audio subgroup or the 2nd video master. This special behaviour is triggered - * by the predicate "ord(##)" in the query. The \em remainder of the query is supposed to - * designate a \em default in this case, rather then querying directly for the result of - * the mapping. Thus this remainder of the query is used to retrieve a \em source pipe, + * by the predicate "ord(##)" in the query. The _remainder of the query_ is supposed to + * designate a _default_ in this case, rather then querying directly for the result of + * the mapping. Thus this remainder of the query is used to retrieve a _source pipe_, * which then is treated as if accessing a non-existent mapping: a suitable default * solution for this mapping is retrieved, but in this special case, we append the * given sequence number to the ID of the retrieved pipe, i.e. we get the Nth - * (identical) solution to the aforementioned query for a default pipe. + * (identical) solution to the aforementioned query for a default pipe. * * @note the mapped result is remembered within this mapping. Further invocations - * with the \em same query will just fetch this stored pipe-ID and hand it + * with the _same query_ will just fetch this stored pipe-ID and hand it * to the functor, without resolving the query again. You might want to - * \link Resolver::disconnect remove \endlink this specific mapping - * in order to force re-evaluation of the query. + * [remove](\ref Resolver::disconnect) this specific mapping + * in order to force re-evaluation of the query. * @param Query for a pipe, which is handed over as-is to the rules engine. * @warning depending on the actual query, there might be no solution, - * in which case an \em unconnected marker is retrieved and + * in which case an _unconnected marker_ is retrieved and * stored. Thus the yielded Resolver should be checked, * if in doubt. */ @@ -383,12 +384,12 @@ namespace mobject { OutputMapping::operator[] (Query query4pipe) { HashVal hash4query = _mapping::slot (query4pipe); - if (!contains (hash4query)) + if (not contains (hash4query)) { if (uint seqNr = _mapping::is_defaults_query_with_channel (query4pipe)) { // treat the special case - // when actually requesting the "Nth default of this kind" + // when actually requesting the "Nth default of this kind" PPipe corresponding_sourcePipe = asset::Struct::retrieve ( _mapping::build_corresponding_sourceQuery (query4pipe)); diff --git a/tests/core/proc/mobject/output-mapping-test.cpp b/tests/core/proc/mobject/output-mapping-test.cpp index 0b15714f1..8617e9a78 100644 --- a/tests/core/proc/mobject/output-mapping-test.cpp +++ b/tests/core/proc/mobject/output-mapping-test.cpp @@ -88,7 +88,7 @@ namespace test { typedef OutputMapping Mapping; virtual void - run (Arg) + run (Arg) { map_and_retrieve(); instance_copy(); diff --git a/tests/library/format-cout-test.cpp b/tests/library/format-cout-test.cpp index 19c2df69e..1e2e9bf88 100644 --- a/tests/library/format-cout-test.cpp +++ b/tests/library/format-cout-test.cpp @@ -49,7 +49,7 @@ namespace test { namespace { // test fixture /** opaque class without string conversion */ - class Reticent + class Reticent { uint neigh_ = 42; }; @@ -82,11 +82,11 @@ namespace test { void showTraits() { - using CharLit = typeof("literal"); - using CharPtr = typeof(const char*); - using StrCRef = typeof(string const&); - using GenNodePtr = typeof(GenNode*); - using GenNodeRef = typeof(GenNode&); + using CharLit = decltype("literal"); + using CharPtr = const char*; + using StrCRef = string const&; + using GenNodePtr = GenNode*; + using GenNodeRef = GenNode&; ANALYSE (double); ANALYSE (string); @@ -110,7 +110,7 @@ namespace test { * @test How to build generic string conversion into `ostream::operator<< `. * This task (#985) was actually a conglomerate of several chores: * - sanitise and segregate the type-traits usage - * - disentangle the existing util::str conversion helper + * - disentangle the existing util::str() conversion helper * - extract a basic form from this helper, which can be placed * into a header with minimal dependencies. After some consideration, * I decided to allow `` in this category, which allows us diff --git a/tests/library/meta/type-display-test.cpp b/tests/library/meta/type-display-test.cpp index 8a6752cf4..01886295c 100644 --- a/tests/library/meta/type-display-test.cpp +++ b/tests/library/meta/type-display-test.cpp @@ -122,8 +122,8 @@ namespace test{ CHECK (typeStr(&magic) == "Space const* (*)(Outer::Inner&&)"); CHECK (typeSymbol(&magic) == "Function"); - CHECK (typeStr ::Inner>() == "Outer::Inner"); - CHECK (typeSymbol::Inner>() == "Inner" ); + CHECK (typeStr ::Inner>() == "Outer::Inner"); + CHECK (typeSymbol::Inner>() == "Inner" ); CHECK (primaryTypeComponent("") == "void" ); CHECK (primaryTypeComponent("Sym&") == "Sym" );