--- /dev/null
+#ifndef __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_H__
+#define __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_H__
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+namespace tensor
+{
+
+template <typename T> struct TextFormatted;
+
+template <typename T> TextFormatted<T> txtfmt(const T &obj) { return TextFormatted<T>{obj}; }
+
+} // namespace tensor
+} // namespace ADT
+} // namespace core
+} // namespace nncc
+
+#endif // __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_INDEX_H__
--- /dev/null
+#ifndef __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_INDEX_H__
+#define __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_INDEX_H__
+
+#include "nncc/core/ADT/tensor/Index.h"
+#include "nncc/core/ADT/tensor/TextFormatted.h"
+
+#include "nncc/core/ADT/Printable.h"
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+namespace tensor
+{
+
+template <> class TextFormatted<Index> final : public nncc::core::ADT::Printable
+{
+public:
+ explicit TextFormatted(const Index &index) : _index(index)
+ {
+ // DO NOTHING
+ }
+
+public:
+ void print(std::ostream &os) const override;
+
+private:
+ const Index &_index;
+};
+
+} // namespace tensor
+} // namespace ADT
+} // namespace core
+} // namespace nncc
+
+#endif // __NNCC_CORE_ADT_TENSOR_TEXT_FORMATTED_INDEX_H__
--- /dev/null
+#include "nncc/core/ADT/tensor/TextFormattedIndex.h"
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+namespace tensor
+{
+
+void TextFormatted<Index>::print(std::ostream &os) const
+{
+ const auto rank = _index.rank();
+
+ if (rank > 0)
+ {
+ os << _index.at(0);
+
+ if (rank > 1)
+ {
+ for (uint32_t axis = 1; axis < rank; ++axis)
+ {
+ os << ", " << _index.at(axis);
+ }
+ }
+ }
+}
+
+} // namespace tensor
+} // namespace ADT
+} // namespace core
+} // namespace nncc
--- /dev/null
+#include "nncc/core/ADT/tensor/TextFormattedIndex.h"
+
+#include <string>
+#include <sstream>
+
+#include <gtest/gtest.h>
+
+TEST(ADT_TENSOR_TEXT_FORMATTED_INDEX, message)
+{
+ const nncc::core::ADT::tensor::Index index{2, 3};
+
+ std::stringstream ss;
+
+ ss << nncc::core::ADT::tensor::txtfmt(index);
+
+ ASSERT_EQ(ss.str(), "2, 3");
+}