diff --git a/modcc/functionexpander.cpp b/modcc/functionexpander.cpp index afa91755df537fed97a0f7639843f833a6de2f13..402ca71cfaa7c2677dcd9900079fa59526ed7e75 100644 --- a/modcc/functionexpander.cpp +++ b/modcc/functionexpander.cpp @@ -5,6 +5,8 @@ #include "functionexpander.hpp" #include "modccutil.hpp" +using namespace nest::mc; + expression_ptr insert_unique_local_assignment(call_list_type& stmts, Expression* e) { auto exprs = make_unique_local_assign(e->scope(), e); stmts.push_front(std::move(exprs.local_decl)); @@ -18,7 +20,7 @@ expression_ptr insert_unique_local_assignment(call_list_type& stmts, Expression* call_list_type lower_function_calls(Expression* e) { - auto v = make_unique<FunctionCallLowerer>(e->scope()); + auto v = util::make_unique<FunctionCallLowerer>(e->scope()); if(auto a=e->is_assignment()) { #ifdef LOGGING diff --git a/modcc/functioninliner.cpp b/modcc/functioninliner.cpp index 5e0216b9f354e13a9d9e178912808e079cc0a16b..837c36f03a3922e4bfbf7d8223bd3a2ee8024fc2 100644 --- a/modcc/functioninliner.cpp +++ b/modcc/functioninliner.cpp @@ -5,6 +5,8 @@ #include "modccutil.hpp" #include "errorvisitor.hpp" +using namespace nest::mc; + expression_ptr inline_function_call(Expression* e) { if(auto f=e->is_function_call()) { @@ -34,7 +36,7 @@ expression_ptr inline_function_call(Expression* e) << " in the expression " << new_e->to_string() << "\n"; #endif auto v = - make_unique<VariableReplacer>( + util::make_unique<VariableReplacer>( fargs[i]->is_argument()->spelling(), id->spelling() ); @@ -47,7 +49,7 @@ expression_ptr inline_function_call(Expression* e) << " in the expression " << new_e->to_string() << "\n"; #endif auto v = - make_unique<ValueInliner>( + util::make_unique<ValueInliner>( fargs[i]->is_argument()->spelling(), value->value() ); @@ -62,7 +64,7 @@ expression_ptr inline_function_call(Expression* e) } new_e->semantic(e->scope()); - auto v = make_unique<ErrorVisitor>(""); + auto v = util::make_unique<ErrorVisitor>(""); new_e->accept(v.get()); #ifdef LOGGING std::cout << "inline_function_call result " << new_e->to_string() << "\n\n"; diff --git a/modcc/modcc.cpp b/modcc/modcc.cpp index 5a642cec5e3565f30fd52a75ba3cd44f8bcbc8cb..0375eece7adddbe903a58ee95372e2a8479d7ba1 100644 --- a/modcc/modcc.cpp +++ b/modcc/modcc.cpp @@ -13,6 +13,8 @@ #include "modccutil.hpp" #include "options.hpp" +using namespace nest::mc; + //#define VERBOSE int main(int argc, char **argv) { @@ -173,13 +175,13 @@ int main(int argc, char **argv) { std::cout << yellow("method " + method->name()) << "\n"; std::cout << white("-------------------------\n"); - auto flops = make_unique<FlopVisitor>(); + auto flops = util::make_unique<FlopVisitor>(); method->accept(flops.get()); std::cout << white("FLOPS") << std::endl; std::cout << flops->print() << std::endl; std::cout << white("MEMOPS") << std::endl; - auto memops = make_unique<MemOpVisitor>(); + auto memops = util::make_unique<MemOpVisitor>(); method->accept(memops.get()); std::cout << memops->print() << std::endl;; } diff --git a/modcc/modccutil.hpp b/modcc/modccutil.hpp index fde6828c5ea42d40e7b47ec62f742719c7eb35b7..63f0701a57da67c4cf029882cc1da1417df9374e 100644 --- a/modcc/modccutil.hpp +++ b/modcc/modccutil.hpp @@ -138,9 +138,16 @@ std::ostream& operator<< (std::ostream& os, std::vector<T> const& V) { return os << "]"; } +namespace nest { +namespace mc { +namespace util { + // just because we aren't using C++14, doesn't mean we shouldn't go // without make_unique template <typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args) ...)); } + +}}} + diff --git a/modcc/module.cpp b/modcc/module.cpp index be76e87c8d19bc7cfe652bf05915963cbe92e12f..e65aecd03a3fab2055c6a8526ea3e474b438b566 100644 --- a/modcc/module.cpp +++ b/modcc/module.cpp @@ -11,6 +11,8 @@ #include "module.hpp" #include "parser.hpp" +using namespace nest::mc; + Module::Module(std::string const& fname) : fname_(fname) { @@ -163,7 +165,7 @@ bool Module::semantic() { s->semantic(symbols_); // then use an error visitor to print out all the semantic errors - auto v = make_unique<ErrorVisitor>(file_name()); + auto v = util::make_unique<ErrorVisitor>(file_name()); s->accept(v.get()); errors += v->num_errors(); @@ -427,7 +429,7 @@ bool Module::semantic() { } else { // create visitor for linear analysis - auto v = make_unique<ExpressionClassifierVisitor>(sym); + auto v = util::make_unique<ExpressionClassifierVisitor>(sym); rhs->accept(v.get()); // quit if ODE is not linear @@ -529,9 +531,9 @@ bool Module::semantic() { auto rhs = e->is_assignment()->rhs(); // analyze the expression for linear terms - //auto v = make_unique<ExpressionClassifierVisitor>(symbols_["v"].get()); + //auto v = util::make_unique<ExpressionClassifierVisitor>(symbols_["v"].get()); auto v_symbol = breakpoint->scope()->find("v"); - auto v = make_unique<ExpressionClassifierVisitor>(v_symbol); + auto v = util::make_unique<ExpressionClassifierVisitor>(v_symbol); rhs->accept(v.get()); if(v->classify()==expressionClassification::linear) { @@ -555,7 +557,7 @@ bool Module::semantic() { block.emplace_back(Parser("current_ = weights_ * current_").parse_line_expression()); } - auto v = make_unique<ConstantFolderVisitor>(); + auto v = util::make_unique<ConstantFolderVisitor>(); for(auto& e : block) { e->accept(v.get()); } @@ -780,7 +782,7 @@ bool Module::optimize() { // how to structure the optimizer // loop over APIMethods // - apply optimization to each in turn - auto folder = make_unique<ConstantFolderVisitor>(); + auto folder = util::make_unique<ConstantFolderVisitor>(); for(auto &symbol : symbols_) { auto kind = symbol.second->kind(); BlockExpression* body; diff --git a/src/ion.hpp b/src/ion.hpp index 9065e9c85c9762d627060806a172ac25faf02193..8fbe57f86f701f726217a1041a3b4a42b2f8e64b 100644 --- a/src/ion.hpp +++ b/src/ion.hpp @@ -1,7 +1,7 @@ #pragma once +#include <array> #include <memory/memory.hpp> - #include <indexed_view.hpp> namespace nest { diff --git a/src/util/cycle.hpp b/src/util/cycle.hpp index 66611f1c3601aea36f921c21c4f57ce85b1d3807..a4d2b050e2e28c035be0743a7976bb5cdd7e7487 100644 --- a/src/util/cycle.hpp +++ b/src/util/cycle.hpp @@ -191,8 +191,8 @@ template < typename = enable_if_t<std::is_same<SeqIter, SeqSentinel>::value> > range<cyclic_iterator<SeqIter, SeqSentinel> > cyclic_view(const Seq& s) { - return { make_cyclic_iterator(cbegin(s), cend(s)), - make_cyclic_iterator(cend(s), cend(s)) }; + return { make_cyclic_iterator(util::cbegin(s), util::cend(s)), + make_cyclic_iterator(util::cend(s), util::cend(s)) }; } template < @@ -203,7 +203,7 @@ template < > range<cyclic_iterator<SeqIter, SeqSentinel>, SeqSentinel> cyclic_view(const Seq& s) { - return { make_cyclic_iterator(cbegin(s), cend(s)), cend(s) }; + return { make_cyclic_iterator(util::cbegin(s), util::cend(s)), util::cend(s) }; } // Handle initializer lists @@ -211,8 +211,8 @@ template <typename T> range<cyclic_iterator<typename std::initializer_list<T>::const_iterator, typename std::initializer_list<T>::const_iterator> > cyclic_view(const std::initializer_list<T> &list) { - return { make_cyclic_iterator(cbegin(list), cend(list)), - make_cyclic_iterator(cend(list), cend(list)) }; + return { make_cyclic_iterator(util::cbegin(list), util::cend(list)), + make_cyclic_iterator(util::cend(list), util::cend(list)) }; } } // namespace util diff --git a/src/util/filter.hpp b/src/util/filter.hpp index 6da37f57c175dacfd1a989c4e39a3da6544f47f8..25041e043e956560022eb21ca32e4190b2edf279 100644 --- a/src/util/filter.hpp +++ b/src/util/filter.hpp @@ -209,8 +209,8 @@ template < > range<filter_iterator<seq_citer, seq_citer, util::decay_t<F>>> filter(const Seq& s, const F& f) { - return {make_filter_iterator(cbegin(s), cend(s), f), - make_filter_iterator(cend(s), cend(s), f)}; + return {make_filter_iterator(util::cbegin(s), util::cend(s), f), + make_filter_iterator(util::cend(s), util::cend(s), f)}; } // filter over const and non-const sentinel-terminated sequences: @@ -236,7 +236,7 @@ template < > range<filter_iterator<seq_citer, seq_csent, util::decay_t<F>>, seq_csent> filter(const Seq& s, const F& f) { - return {make_filter_iterator(cbegin(s), cend(s), f), cend(s)}; + return {make_filter_iterator(util::cbegin(s), util::cend(s), f), util::cend(s)}; } } // namespace util diff --git a/src/util/meta.hpp b/src/util/meta.hpp index 34b809bbfe3de94546a743f313f2cee8576e305b..3728a9164ced1b593938a3ee7f0258440516299d 100644 --- a/src/util/meta.hpp +++ b/src/util/meta.hpp @@ -58,14 +58,14 @@ constexpr bool empty(const T (& c)[N]) noexcept { template <typename Seq> struct sequence_traits { using iterator = decltype(std::begin(std::declval<Seq&>())); - using const_iterator = decltype(cbegin(std::declval<Seq&>())); + using const_iterator = decltype(util::cbegin(std::declval<Seq&>())); using value_type = typename std::iterator_traits<iterator>::value_type; using reference = typename std::iterator_traits<iterator>::reference; using difference_type = typename std::iterator_traits<iterator>::difference_type; using size_type = decltype(size(std::declval<Seq&>())); // for use with heterogeneous ranges using sentinel = decltype(std::end(std::declval<Seq&>())); - using const_sentinel = decltype(cend(std::declval<Seq&>())); + using const_sentinel = decltype(util::cend(std::declval<Seq&>())); }; // Convenience short cuts for `enable_if` diff --git a/src/util/transform.hpp b/src/util/transform.hpp index 71c49e723017deb92258dc02be21e66da7dd9118..dfb654fa01c95e55775d63278a37f6bbec4f177b 100644 --- a/src/util/transform.hpp +++ b/src/util/transform.hpp @@ -117,7 +117,7 @@ template < > range<transform_iterator<seq_citer, util::decay_t<F>>> transform_view(const Seq& s, const F& f) { - return {make_transform_iterator(cbegin(s), f), make_transform_iterator(cend(s), f)}; + return {make_transform_iterator(util::cbegin(s), f), make_transform_iterator(util::cend(s), f)}; } template < @@ -129,7 +129,7 @@ template < > range<transform_iterator<seq_citer, util::decay_t<F>>, seq_csent> transform_view(const Seq& s, const F& f) { - return {make_transform_iterator(cbegin(s), f), cend(s)}; + return {make_transform_iterator(util::cbegin(s), f), util::cend(s)}; } } // namespace util diff --git a/tests/modcc/test_kinetic_rewriter.cpp b/tests/modcc/test_kinetic_rewriter.cpp index 4dc1017c1612b0fe25a563a50b63cea65ec9cf15..c242fe8f872a563219e436f340e694254daffd49 100644 --- a/tests/modcc/test_kinetic_rewriter.cpp +++ b/tests/modcc/test_kinetic_rewriter.cpp @@ -48,7 +48,7 @@ static const char* derivative_abc = "} \n"; TEST(KineticRewriter, equiv) { - auto visitor = make_unique<KineticRewriter>(); + auto visitor = util::make_unique<KineticRewriter>(); auto kin = Parser(kinetic_abc).parse_procedure(); auto deriv = Parser(derivative_abc).parse_procedure(); diff --git a/tests/modcc/test_optimization.cpp b/tests/modcc/test_optimization.cpp index 01f0a69c7e9cc8ec918a307bb77dd2a00d5e961b..14fba4292d2b0f7f57bc1fbeaff5d5aa0e37c1fc 100644 --- a/tests/modcc/test_optimization.cpp +++ b/tests/modcc/test_optimization.cpp @@ -6,7 +6,7 @@ #include "modccutil.hpp" TEST(Optimizer, constant_folding) { - auto v = make_unique<ConstantFolderVisitor>(); + auto v = util::make_unique<ConstantFolderVisitor>(); { auto e = parse_line_expression("x = 2*3"); VERBOSE_PRINT( e->to_string() ); diff --git a/tests/modcc/test_visitors.cpp b/tests/modcc/test_visitors.cpp index a5c084e0646d032da09302793190ebde68a8df5e..0ec254e8472fb565bf8810a662f62259dc2bb11b 100644 --- a/tests/modcc/test_visitors.cpp +++ b/tests/modcc/test_visitors.cpp @@ -12,56 +12,56 @@ TEST(FlopVisitor, basic) { { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("x+y"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("x-y"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("x*y"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.mul, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("x/y"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.div, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("exp(x)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.exp, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("log(x)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.log, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("cos(x)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.cos, 1); } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("sin(x)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.sin, 1); @@ -70,7 +70,7 @@ TEST(FlopVisitor, basic) { TEST(FlopVisitor, compound) { { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("x+y*z/a-b"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 2); @@ -79,7 +79,7 @@ TEST(FlopVisitor, compound) { } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("exp(x+y+z)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 2); @@ -87,7 +87,7 @@ TEST(FlopVisitor, compound) { } { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_expression("exp(x+y) + 3/(12 + z)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 3); @@ -97,7 +97,7 @@ TEST(FlopVisitor, compound) { // test asssignment expression { - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_line_expression("x = exp(x+y) + 3/(12 + z)"); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 3); @@ -117,7 +117,7 @@ TEST(FlopVisitor, procedure) { " mtau = 0.6\n" " htau = 1500\n" "}"; - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_procedure(expression); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 6); @@ -139,7 +139,7 @@ TEST(FlopVisitor, function) { " hinf=1/(1+exp((v-vhalfh)/kh))\n" " foo = minf + hinf\n" "}"; - auto visitor = make_unique<FlopVisitor>(); + auto visitor = util::make_unique<FlopVisitor>(); auto e = parse_function(expression); e->accept(visitor.get()); EXPECT_EQ(visitor->flops.add, 7);