Migrate to C++17 and refactor

Change-Id: I53407266939258990a1c3a9363c3ebe9ea113fd2
diff --git a/src/name-assignment/assignment-email.cpp b/src/name-assignment/assignment-email.cpp
index 685a820..2cb6184 100644
--- a/src/name-assignment/assignment-email.cpp
+++ b/src/name-assignment/assignment-email.cpp
@@ -22,7 +22,7 @@
 
 namespace ndncert {
 
-NDNCERT_REGISTER_FUNCFACTORY(AssignmentEmail, "email");
+NDNCERT_REGISTER_NAME_ASSIGNMENT_FUNC(AssignmentEmail, "email");
 
 AssignmentEmail::AssignmentEmail(const std::string& format)
   : NameAssignmentFunc(format)
diff --git a/src/name-assignment/assignment-email.hpp b/src/name-assignment/assignment-email.hpp
index c0bb330..f4eb5c5 100644
--- a/src/name-assignment/assignment-email.hpp
+++ b/src/name-assignment/assignment-email.hpp
@@ -26,12 +26,13 @@
 namespace ndncert {
 
 /**
- * assign names base on client probe parameter
+ * @brief Assign names based on requester's email address
  */
 class AssignmentEmail : public NameAssignmentFunc
 {
 public:
-  explicit AssignmentEmail(const std::string& format = "");
+  explicit
+  AssignmentEmail(const std::string& format = "");
 
   std::vector<ndn::PartialName>
   assignName(const std::multimap<std::string, std::string>& params) override;
diff --git a/src/name-assignment/assignment-func.cpp b/src/name-assignment/assignment-func.cpp
index f4728d3..1e33986 100644
--- a/src/name-assignment/assignment-func.cpp
+++ b/src/name-assignment/assignment-func.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2017-2021, Regents of the University of California.
+ * Copyright (c) 2017-2022, Regents of the University of California.
  *
  * This file is part of ndncert, a certificate management system based on NDN.
  *
@@ -40,15 +40,15 @@
 std::unique_ptr<NameAssignmentFunc>
 NameAssignmentFunc::createNameAssignmentFunc(const std::string& challengeType, const std::string& format)
 {
-  CurriedFuncFactory& factory = getFactory();
+  auto& factory = getFactory();
   auto i = factory.find(challengeType);
   return i == factory.end() ? nullptr : i->second(format);
 }
 
-NameAssignmentFunc::CurriedFuncFactory&
+NameAssignmentFunc::FuncFactory&
 NameAssignmentFunc::getFactory()
 {
-  static NameAssignmentFunc::CurriedFuncFactory factory;
+  static FuncFactory factory;
   return factory;
 }
 
diff --git a/src/name-assignment/assignment-func.hpp b/src/name-assignment/assignment-func.hpp
index 7f35fcf..f08e50c 100644
--- a/src/name-assignment/assignment-func.hpp
+++ b/src/name-assignment/assignment-func.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2017-2021, Regents of the University of California.
+ * Copyright (c) 2017-2022, Regents of the University of California.
  *
  * This file is part of ndncert, a certificate management system based on NDN.
  *
@@ -30,10 +30,12 @@
 class NameAssignmentFunc : boost::noncopyable
 {
 protected:
-  explicit NameAssignmentFunc(const std::string& format = "");
+  explicit
+  NameAssignmentFunc(const std::string& format = "");
 
 public:
-  virtual ~NameAssignmentFunc() = default;
+  virtual
+  ~NameAssignmentFunc() = default;
 
   /**
    * @brief The name assignment function provided by the CA operator to generate available
@@ -48,40 +50,40 @@
   virtual std::vector<ndn::PartialName>
   assignName(const std::multimap<std::string, std::string>& params) = 0;
 
-public:
-  template <class AssignmentType>
+public: // factory
+  template<class AssignmentType>
   static void
-  registerNameAssignmentFunc(const std::string& typeName)
+  registerNameAssignmentFunc(const std::string& type)
   {
-    CurriedFuncFactory& factory = getFactory();
-    BOOST_ASSERT(factory.count(typeName) == 0);
-    factory[typeName] = [](const std::string& format) { return std::make_unique<AssignmentType>(format); };
+    auto& factory = getFactory();
+    BOOST_ASSERT(factory.count(type) == 0);
+    factory[type] = [] (const std::string& format) { return std::make_unique<AssignmentType>(format); };
   }
 
   static std::unique_ptr<NameAssignmentFunc>
-  createNameAssignmentFunc(const std::string& challengeType, const std::string& format = "");
+  createNameAssignmentFunc(const std::string& type, const std::string& format = "");
 
 NDNCERT_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
   std::vector<std::string> m_nameFormat;
 
 private:
-  typedef std::function<std::unique_ptr<NameAssignmentFunc>(const std::string&)> FactoryCreateFunc;
-  typedef std::map<std::string, FactoryCreateFunc> CurriedFuncFactory;
+  using CreateFunc = std::function<std::unique_ptr<NameAssignmentFunc>(const std::string &)>;
+  using FuncFactory = std::map<std::string, CreateFunc>;
 
-  static CurriedFuncFactory&
+  static FuncFactory&
   getFactory();
 };
 
-#define NDNCERT_REGISTER_FUNCFACTORY(C, T)                                        \
-  static class NdnCert##C##FuncFactoryRegistrationClass                           \
-  {                                                                               \
-  public:                                                                         \
-    NdnCert##C##FuncFactoryRegistrationClass()                                    \
-    {                                                                             \
-      ::ndncert::NameAssignmentFunc::registerNameAssignmentFunc<C>(T);            \
-    }                                                                             \
-  } g_NdnCert##C##ChallengeRegistrationVariable
-
 } // namespace ndncert
 
+#define NDNCERT_REGISTER_NAME_ASSIGNMENT_FUNC(C, T)                           \
+static class NdnCert##C##NameAssignmentRegistrationClass                      \
+{                                                                             \
+public:                                                                       \
+  NdnCert##C##NameAssignmentRegistrationClass()                               \
+  {                                                                           \
+    ::ndncert::NameAssignmentFunc::registerNameAssignmentFunc<C>(T);          \
+  }                                                                           \
+} g_NdnCert##C##NameAssignmentRegistrationVariable
+
 #endif // NDNCERT_ASSIGNMENT_FUNC_HPP
diff --git a/src/name-assignment/assignment-hash.cpp b/src/name-assignment/assignment-hash.cpp
index f406619..c8c56e5 100644
--- a/src/name-assignment/assignment-hash.cpp
+++ b/src/name-assignment/assignment-hash.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2017-2021, Regents of the University of California.
+ * Copyright (c) 2017-2022, Regents of the University of California.
  *
  * This file is part of ndncert, a certificate management system based on NDN.
  *
@@ -24,7 +24,7 @@
 
 namespace ndncert {
 
-NDNCERT_REGISTER_FUNCFACTORY(AssignmentHash, "hash");
+NDNCERT_REGISTER_NAME_ASSIGNMENT_FUNC(AssignmentHash, "hash");
 
 AssignmentHash::AssignmentHash(const std::string& format)
   : NameAssignmentFunc(format)
diff --git a/src/name-assignment/assignment-param.cpp b/src/name-assignment/assignment-param.cpp
index e1961e7..6995557 100644
--- a/src/name-assignment/assignment-param.cpp
+++ b/src/name-assignment/assignment-param.cpp
@@ -22,7 +22,7 @@
 
 namespace ndncert {
 
-NDNCERT_REGISTER_FUNCFACTORY(AssignmentParam, "param");
+NDNCERT_REGISTER_NAME_ASSIGNMENT_FUNC(AssignmentParam, "param");
 
 AssignmentParam::AssignmentParam(const std::string& format)
   : NameAssignmentFunc(format)
diff --git a/src/name-assignment/assignment-random.cpp b/src/name-assignment/assignment-random.cpp
index 3305cae..efbe07a 100644
--- a/src/name-assignment/assignment-random.cpp
+++ b/src/name-assignment/assignment-random.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2017-2021, Regents of the University of California.
+ * Copyright (c) 2017-2022, Regents of the University of California.
  *
  * This file is part of ndncert, a certificate management system based on NDN.
  *
@@ -24,7 +24,7 @@
 
 namespace ndncert {
 
-NDNCERT_REGISTER_FUNCFACTORY(AssignmentRandom, "random");
+NDNCERT_REGISTER_NAME_ASSIGNMENT_FUNC(AssignmentRandom, "random");
 
 AssignmentRandom::AssignmentRandom(const std::string& format)
   : NameAssignmentFunc(format)
@@ -34,7 +34,7 @@
 std::vector<ndn::PartialName>
 AssignmentRandom::assignName(const std::multimap<std::string, std::string>&)
 {
-  return {ndn::PartialName(ndn::to_string(ndn::random::generateSecureWord64()))};
+  return {ndn::PartialName(std::to_string(ndn::random::generateSecureWord64()))};
 }
 
 } // namespace ndncert