Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions arcane/src/arcane/core/ItemTypeInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@
/*---------------------------------------------------------------------------*/

#include "arcane/utils/String.h"
#include "arcane/utils/Array.h"

#include "arcane/core/ItemTypeMng.h"
#include "arcane/core/ItemTypeId.h"
// No longer used but keep for compatibility
#include "arcane/core/ItemTypeMng.h"

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

namespace Arcane
{
class ItemTypeMng;

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
Expand All @@ -44,6 +47,8 @@ namespace Arcane
*/
class ItemTypeInfo
{
friend class ItemTypeInfoBuilder;

public:

/*!
Expand Down Expand Up @@ -135,39 +140,38 @@ class ItemTypeInfo
//! Type of the corresponding linear element
ItemTypeId linearItemTypeId() const { return m_linear_type_id; }
//! Type of the corresponding linear element
const ItemTypeInfo* linearTypeInfo() const { return m_mng->typeFromId(m_linear_type_id); }
const ItemTypeInfo* linearTypeInfo() const { return m_linear_type; }
//! Indicates if the type has a center node
bool hasCenterNode() const { return m_has_center_node; }
/*!
* \brief Indicates if the type is a polygon.
*
* A polygon is a 2D element of order 1 containing at least 5 nodes.
*/
bool isPolygon() const { return m_is_poly && m_dimension==2; }
bool isPolygon() const { return m_is_poly && m_dimension == 2; }
//! Indicates if the type is a polyhedron
bool isPolyhedron() const { return m_is_poly && m_dimension==3; }
bool isPolyhedron() const { return m_is_poly && m_dimension == 3; }

public:

//! Local connectivity of the i-th edge of the cell
LocalEdge localEdge(Integer id) const
{
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
Integer fi = buf[m_first_item_index + id];
return LocalEdge(&buf[fi]);
}

//! Local connectivity of the i-th face of the cell
LocalFace localFace(Integer id) const
{
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
Integer fi = buf[m_first_item_index + m_nb_edge + id];
return LocalFace(&buf[fi]);
}

protected:
private:

ItemTypeMng* m_mng = nullptr;
ItemTypeId m_type_id{ IT_NullType };
ItemTypeId m_linear_type_id{ IT_NullType };
//! Dimension (-1) if not initialized.
Expand All @@ -185,6 +189,9 @@ class ItemTypeInfo
//! Index of this type in the list of indices of \a m_mng.
Integer m_first_item_index = 0;
String m_type_name;
const ItemTypeInfo* m_linear_type = this;
ItemTypeMng* m_mng = nullptr;
Array<Int32>* m_ids_buffer = nullptr;
};

/*---------------------------------------------------------------------------*/
Expand Down
46 changes: 25 additions & 21 deletions arcane/src/arcane/core/ItemTypeInfoBuilder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
Dimension dimension, Int32 nb_node, Int32 nb_edge, Int32 nb_face)
{
m_mng = mng;
m_ids_buffer = &mng->m_ids_buffer;
m_type_id = type_id;
m_linear_type_id = type_id;
m_dimension = static_cast<Int16>(dimension);
Expand Down Expand Up @@ -89,10 +90,13 @@
/*---------------------------------------------------------------------------*/

void ItemTypeInfoBuilder::
setOrder(Int16 order, ItemTypeId linear_type_id)
setOrder(Int16 order, ItemTypeInfo* linear_type)

Check warning on line 93 in arcane/src/arcane/core/ItemTypeInfoBuilder.cc

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Make the type of this parameter a pointer-to-const. The current type of "linear_type" is "class Arcane::ItemTypeInfo *".

See more on https://sonarcloud.io/project/issues?id=arcaneframework_framework&issues=AaFpDpzRkkiW8IFnVRXO&open=AaFpDpzRkkiW8IFnVRXO&pullRequest=2841
{
if (!linear_type)
ARCANE_FATAL("Null linear type for type '{0}'", m_type_name);
m_order = order;
m_linear_type_id = linear_type_id;
m_linear_type = linear_type;
m_linear_type_id = linear_type->itemTypeId();
_checkSetIsPolygon();
}

Expand All @@ -102,7 +106,7 @@
void ItemTypeInfoBuilder::
addEdge(Int32 edge_index, Int32 n0, Int32 n1, Int32 f_left, Int32 f_right)
{
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + edge_index] = buf.size();
buf.add(n0);
buf.add(n1);
Expand All @@ -116,7 +120,7 @@
void ItemTypeInfoBuilder::
addEdge2D(Integer edge_index, Integer n0, Integer n1)
{
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + edge_index] = buf.size();
buf.add(n0);
buf.add(n1);
Expand All @@ -131,7 +135,7 @@
addFaceVertex(Integer face_index, Integer n0)
{
_checkDimension(1);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_FaceVertex);
buf.add(1);
Expand All @@ -146,7 +150,7 @@
addFaceLine(Integer face_index, Integer n0, Integer n1)
{
_checkDimension(2);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Line2);
buf.add(2);
Expand Down Expand Up @@ -177,7 +181,7 @@
addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
{
_checkDimension(2);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Line3);
buf.add(3);
Expand All @@ -195,7 +199,7 @@
addFaceLine4(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
{
_checkDimension(2);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Line4);
buf.add(4);
Expand All @@ -213,7 +217,7 @@
addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Triangle3);
buf.add(3);
Expand All @@ -233,7 +237,7 @@
Integer n3, Integer n4, Integer n5)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Triangle6);
buf.add(6);
Expand All @@ -255,7 +259,7 @@
addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Quad4);
buf.add(4);
Expand All @@ -276,7 +280,7 @@
Integer n4, Integer n5, Integer n6, Integer n7)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Quad8);
buf.add(8);
Expand All @@ -301,7 +305,7 @@
Integer n4, Integer n5, Integer n6, Integer n7, Integer n8)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Quad9);
buf.add(9);
Expand All @@ -326,7 +330,7 @@
addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Pentagon5);
buf.add(5);
Expand All @@ -348,7 +352,7 @@
Integer n3, Integer n4, Integer n5)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Hexagon6);
buf.add(6);
Expand All @@ -371,7 +375,7 @@
Integer n4, Integer n5, Integer n6)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Heptagon7);
buf.add(7);
Expand All @@ -395,7 +399,7 @@
Integer n4, Integer n5, Integer n6, Integer n7)
{
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(IT_Octogon8);
buf.add(8);
Expand All @@ -421,7 +425,7 @@
// Currently, this method is only called for 2D faces, so
// the current element must be of dimension 3.
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(type_id);
Integer face_nb_node = n.size();
Expand All @@ -443,7 +447,7 @@
// Currently, this method is only called for 2D faces, so
// the current element must be of dimension 3.
_checkDimension(3);
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
buf.add(type_id);
Integer face_nb_node = nodes.size();
Expand All @@ -463,7 +467,7 @@
{
Integer cell_nb_edge = nbLocalEdge();
for (Integer i_face = 0; i_face < nbLocalFace(); ++i_face) {
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
Integer* index = &buf[fi];
LocalFace local_face(index);
Expand Down Expand Up @@ -503,7 +507,7 @@
m_nb_edge = nb_edge;
Integer total = m_nb_face + m_nb_edge;
if (total != 0) {
Array<Integer>& buf = m_mng->m_ids_buffer;
Array<Integer>& buf = *m_ids_buffer;
m_first_item_index = buf.size();
buf.resize(m_first_item_index + total);
}
Expand Down
6 changes: 3 additions & 3 deletions arcane/src/arcane/core/ItemTypeInfoBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ namespace Arcane

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

/*!
* \internal
* \brief Construction of the information for a mesh entity type.
Expand Down Expand Up @@ -95,12 +94,13 @@ class ItemTypeInfoBuilder
Int32 nb_node, Int32 nb_edge, Int32 nb_face);

/*!
* \brief Positions the order of the type.
* \brief Set the order of the type.
*
* If not called, the type is considered to be for order 1 entities.
* The first argument is the entity order and the second is the corresponding order 1 element.
* You have to call setInfos() before calling this method.
*/
void setOrder(Int16 order, ItemTypeId linear_type);
void setOrder(Int16 order, ItemTypeInfo* linear_type);

/*!
* \brief Adds an edge to the list of edges
Expand Down
Loading
Loading