From 9742f3f8a207f1a605f3322ff1505b02e6b52038 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 15 Feb 2022 11:59:20 +0100
Subject: [PATCH] Change numbering of item type

Also add dimension(ItemType) utility according to the space dimension
---
 src/mesh/ItemType.hpp   | 31 ++++++++++++++++++++++++++-----
 tests/test_ItemType.cpp | 23 +++++++++++++++++++----
 2 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/src/mesh/ItemType.hpp b/src/mesh/ItemType.hpp
index c2f2da131..285806fe0 100644
--- a/src/mesh/ItemType.hpp
+++ b/src/mesh/ItemType.hpp
@@ -59,8 +59,8 @@ struct ItemTypeId<1>
       i = 0;
       break;
     }
-    case ItemType::edge:
     case ItemType::face:
+    case ItemType::edge:
     case ItemType::node: {
       // in 1d, faces, edges and nodes are the same
       i = 1;
@@ -69,6 +69,13 @@ struct ItemTypeId<1>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 1 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
@@ -87,8 +94,8 @@ struct ItemTypeId<2>
       i = 0;
       break;
     }
-    case ItemType::edge:
-    case ItemType::face: {
+    case ItemType::face:
+    case ItemType::edge: {
       // in 2d, faces and edges are the same
       i = 1;
       break;
@@ -100,6 +107,13 @@ struct ItemTypeId<2>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 2 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
@@ -118,11 +132,11 @@ struct ItemTypeId<3>
       i = 0;
       break;
     }
-    case ItemType::edge: {
+    case ItemType::face: {
       i = 1;
       break;
     }
-    case ItemType::face: {
+    case ItemType::edge: {
       i = 2;
       break;
     }
@@ -133,6 +147,13 @@ struct ItemTypeId<3>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 3 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
diff --git a/tests/test_ItemType.cpp b/tests/test_ItemType.cpp
index d560a7098..ba5d7fe60 100644
--- a/tests/test_ItemType.cpp
+++ b/tests/test_ItemType.cpp
@@ -30,24 +30,39 @@ TEST_CASE("ItemType", "[connectivity]")
   SECTION("checking for item ids in 1d")
   {
     REQUIRE(ItemTypeId<1>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<1>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<1>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<1>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<1>::itemTId(node_type) == 1);
+
+    REQUIRE(ItemTypeId<1>::dimension(cell_type) == 1);
+    REQUIRE(ItemTypeId<1>::dimension(face_type) == 0);
+    REQUIRE(ItemTypeId<1>::dimension(edge_type) == 0);
+    REQUIRE(ItemTypeId<1>::dimension(node_type) == 0);
   }
 
   SECTION("checking for item ids in 2d")
   {
     REQUIRE(ItemTypeId<2>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<2>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<2>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<2>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<2>::itemTId(node_type) == 2);
+
+    REQUIRE(ItemTypeId<2>::dimension(cell_type) == 2);
+    REQUIRE(ItemTypeId<2>::dimension(face_type) == 1);
+    REQUIRE(ItemTypeId<2>::dimension(edge_type) == 1);
+    REQUIRE(ItemTypeId<2>::dimension(node_type) == 0);
   }
 
   SECTION("checking for item ids in 3d")
   {
     REQUIRE(ItemTypeId<3>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<3>::itemTId(edge_type) == 1);
-    REQUIRE(ItemTypeId<3>::itemTId(face_type) == 2);
+    REQUIRE(ItemTypeId<3>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<3>::itemTId(edge_type) == 2);
     REQUIRE(ItemTypeId<3>::itemTId(node_type) == 3);
+
+    REQUIRE(ItemTypeId<3>::dimension(cell_type) == 3);
+    REQUIRE(ItemTypeId<3>::dimension(face_type) == 2);
+    REQUIRE(ItemTypeId<3>::dimension(edge_type) == 1);
+    REQUIRE(ItemTypeId<3>::dimension(node_type) == 0);
   }
 }
-- 
GitLab