diff --git a/ndn-cxx/encoding/estimator.cpp b/ndn-cxx/encoding/estimator.cpp
index 5e3a31a..a6d0c24 100644
--- a/ndn-cxx/encoding/estimator.cpp
+++ b/ndn-cxx/encoding/estimator.cpp
@@ -25,42 +25,6 @@
 namespace encoding {
 
 size_t
-Estimator::prependVarNumber(uint64_t n) const noexcept
-{
-  return tlv::sizeOfVarNumber(n);
-}
-
-size_t
-Estimator::appendVarNumber(uint64_t n) const noexcept
-{
-  return tlv::sizeOfVarNumber(n);
-}
-
-size_t
-Estimator::prependNonNegativeInteger(uint64_t n) const noexcept
-{
-  return tlv::sizeOfNonNegativeInteger(n);
-}
-
-size_t
-Estimator::appendNonNegativeInteger(uint64_t n) const noexcept
-{
-  return tlv::sizeOfNonNegativeInteger(n);
-}
-
-size_t
-Estimator::prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
-{
-  return tlv::sizeOfVarNumber(type) + tlv::sizeOfVarNumber(arraySize) + arraySize;
-}
-
-size_t
-Estimator::appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
-{
-  return prependByteArrayBlock(type, array, arraySize);
-}
-
-size_t
 Estimator::prependBlock(const Block& block) const
 {
   if (block.hasWire()) {
@@ -71,11 +35,5 @@
   }
 }
 
-size_t
-Estimator::appendBlock(const Block& block) const
-{
-  return prependBlock(block);
-}
-
 } // namespace encoding
 } // namespace ndn
diff --git a/ndn-cxx/encoding/estimator.hpp b/ndn-cxx/encoding/estimator.hpp
index 5341ccd..9f43c1f 100644
--- a/ndn-cxx/encoding/estimator.hpp
+++ b/ndn-cxx/encoding/estimator.hpp
@@ -77,7 +77,7 @@
    * @brief Prepend bytes from the range [@p first, @p last)
    */
   template<class Iterator>
-  size_t
+  constexpr size_t
   prependRange(Iterator first, Iterator last) const noexcept
   {
     return std::distance(first, last);
@@ -87,7 +87,7 @@
    * @brief Append bytes from the range [@p first, @p last)
    */
   template<class Iterator>
-  size_t
+  constexpr size_t
   appendRange(Iterator first, Iterator last) const noexcept
   {
     return std::distance(first, last);
@@ -96,38 +96,56 @@
   /**
    * @brief Prepend @p n in VarNumber encoding
    */
-  size_t
-  prependVarNumber(uint64_t n) const noexcept;
+  constexpr size_t
+  prependVarNumber(uint64_t n) const noexcept
+  {
+    return tlv::sizeOfVarNumber(n);
+  }
 
   /**
    * @brief Append @p n in VarNumber encoding
    */
-  size_t
-  appendVarNumber(uint64_t n) const noexcept;
+  constexpr size_t
+  appendVarNumber(uint64_t n) const noexcept
+  {
+    return tlv::sizeOfVarNumber(n);
+  }
 
   /**
    * @brief Prepend @p n in NonNegativeInteger encoding
    */
-  size_t
-  prependNonNegativeInteger(uint64_t n) const noexcept;
+  constexpr size_t
+  prependNonNegativeInteger(uint64_t n) const noexcept
+  {
+    return tlv::sizeOfNonNegativeInteger(n);
+  }
 
   /**
    * @brief Append @p n in NonNegativeInteger encoding
    */
-  size_t
-  appendNonNegativeInteger(uint64_t n) const noexcept;
+  constexpr size_t
+  appendNonNegativeInteger(uint64_t n) const noexcept
+  {
+    return tlv::sizeOfNonNegativeInteger(n);
+  }
 
   /**
    * @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
    */
-  size_t
-  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept;
+  constexpr size_t
+  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
+  {
+    return tlv::sizeOfVarNumber(type) + tlv::sizeOfVarNumber(arraySize) + arraySize;
+  }
 
   /**
    * @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
    */
-  size_t
-  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept;
+  constexpr size_t
+  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
+  {
+    return tlv::sizeOfVarNumber(type) + tlv::sizeOfVarNumber(arraySize) + arraySize;
+  }
 
   /**
    * @brief Prepend TLV block @p block
@@ -139,7 +157,10 @@
    * @brief Append TLV block @p block
    */
   size_t
-  appendBlock(const Block& block) const;
+  appendBlock(const Block& block) const
+  {
+    return prependBlock(block);
+  }
 };
 
 } // namespace encoding
