mgmt: FaceEventNotification equality operators and formatted output

Change-Id: I92aca47a2e3823592d1c0bef07a42dbba5c6cb91
Refs: #3903
diff --git a/src/util/concepts.hpp b/src/util/concepts.hpp
index 20d857e..bb8c744 100644
--- a/src/util/concepts.hpp
+++ b/src/util/concepts.hpp
@@ -106,16 +106,15 @@
   }
 };
 
-/** \brief a concept check for a Status Dataset item
- *  \sa https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
- */
+namespace detail {
+
 template<class X>
-class StatusDatasetItem : public WireEncodable<X>
-                        , public WireEncodableWithEncodingBuffer<X>
-                        , public WireDecodable<X>
+class NfdMgmtProtocolStruct : public WireEncodable<X>
+                            , public WireEncodableWithEncodingBuffer<X>
+                            , public WireDecodable<X>
 {
 public:
-  BOOST_CONCEPT_USAGE(StatusDatasetItem)
+  BOOST_CONCEPT_USAGE(NfdMgmtProtocolStruct)
   {
     static_assert(std::is_default_constructible<X>::value, "");
     static_assert(boost::has_equal_to<X, X, bool>::value, "");
@@ -125,6 +124,24 @@
   }
 };
 
+} // namespace detail
+
+/** \brief concept check for an item in a Status Dataset
+ *  \sa https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
+ */
+template<class X>
+class StatusDatasetItem : public detail::NfdMgmtProtocolStruct<X>
+{
+};
+
+/** \brief concept check for an item in a Notification Stream
+ *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
+ */
+template<class X>
+class NotificationStreamItem : public detail::NfdMgmtProtocolStruct<X>
+{
+};
+
 // NDN_CXX_ASSERT_DEFAULT_CONSTRUCTIBLE and NDN_CXX_ASSERT_FORWARD_ITERATOR
 // originally written as part of NFD codebase