bmmesh api - use struct rather than int[4] to initialize mesh sizes.
authorCampbell Barton <ideasman42@gmail.com>
Thu, 1 Mar 2012 20:09:17 +0000 (20:09 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 1 Mar 2012 20:09:17 +0000 (20:09 +0000)
also correct bad assert() in previous commit.

19 files changed:
source/blender/blenkernel/intern/customdata.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/modifiers_bmesh.c
source/blender/bmesh/bmesh.h
source/blender/bmesh/bmesh_class.h
source/blender/bmesh/bmesh_operator_api.h
source/blender/bmesh/intern/bmesh_construct.c
source/blender/bmesh/intern/bmesh_mesh.c
source/blender/bmesh/intern/bmesh_mesh.h
source/blender/bmesh/intern/bmesh_operator_api_inline.c
source/blender/bmesh/intern/bmesh_walkers.c
source/blender/bmesh/operators/bmo_dissolve.c
source/blender/bmesh/operators/bmo_dupe.c
source/blender/bmesh/operators/bmo_edgesplit.c
source/blender/bmesh/operators/bmo_mesh_conv.c
source/blender/bmesh/tools/BME_bevel.c
source/blender/editors/mesh/bmesh_tools.c
source/blender/editors/mesh/bmesh_utils.c
source/blender/editors/mesh/knifetool.c

index 1d6e6be0fba577df7393e53761b6e8b54ad6ff05..09525e23c6b01b3c5e56a458eda47f49cc9b0f9a 100644 (file)
@@ -51,6 +51,7 @@
 #include "BLI_mempool.h"
 #include "BLI_utildefines.h"
 
+#include "BKE_utildefines.h"
 #include "BKE_customdata.h"
 #include "BKE_customdata_file.h"
 #include "BKE_global.h"
index f9dc0ef0b93c15c35c9927d864a83f496739b971..33ef226f411ed3fa2a5213689706bdeee9bd132d 100644 (file)
@@ -526,7 +526,7 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me, Object *ob)
 {
        BMesh *bm;
 
-       bm = BM_mesh_create(ob, bm_mesh_allocsize_default);
+       bm = BM_mesh_create(ob, &bm_mesh_allocsize_default);
 
        BMO_op_callf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%b", me, ob, TRUE);
 
index 6bca40be1e27884bbf3ffa0741611d86325133b8..fb7e18e295e1758ea371635a4158477d9e1b7b4d 100644 (file)
@@ -143,8 +143,12 @@ BMEditMesh *DM_to_editbmesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing, i
        BMEditMesh *em = existing;
        BMesh *bm;
 
-       if (em) bm = em->bm;
-       else bm = BM_mesh_create(ob, bm_mesh_allocsize_default);
+       if (em) {
+               bm = em->bm;
+       }
+       else {
+               bm = BM_mesh_create(ob, &bm_mesh_allocsize_default);
+       }
 
        DM_to_bmesh_ex(dm, bm);
 
@@ -164,7 +168,7 @@ BMesh *DM_to_bmesh(Object *ob, DerivedMesh *dm)
 {
        BMesh *bm;
 
-       bm = BM_mesh_create(ob, bm_mesh_allocsize_default);
+       bm = BM_mesh_create(ob, &bm_mesh_allocsize_default);
 
        DM_to_bmesh_ex(dm, bm);
 
index 17658d86e7e50ab107a9d3ad669428f45605e613..9cf71e66b1c5e625b2842d6cf107072c28c9d7ab 100644 (file)
@@ -201,63 +201,13 @@ extern "C" {
 #include "DNA_listBase.h"
 #include "DNA_customdata_types.h"
 
+#include <stdlib.h>
 #include "BLI_utildefines.h"
 
 #include "bmesh_class.h"
 
 /*forward declarations*/
 
-/*
- * BMHeader
- *
- * All mesh elements begin with a BMHeader. This structure
- * hold several types of data
- *
- * 1: The type of the element (vert, edge, loop or face)
- * 2: Persistant "header" flags/markings (sharp, seam, select, hidden, ect)
-      note that this is different from the "tool" flags.
- * 3: Unique ID in the bmesh.
- * 4: some elements for internal record keeping.
- *
-*/
-
-/* BMHeader->htype (char) */
-enum {
-       BM_VERT = 1,
-       BM_EDGE = 2,
-       BM_LOOP = 4,
-       BM_FACE = 8
-};
-
-#define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
-
-/* BMHeader->hflag (char) */
-enum {
-       BM_ELEM_SELECT  = (1 << 0),
-       BM_ELEM_HIDDEN  = (1 << 1),
-       BM_ELEM_SEAM    = (1 << 2),
-       BM_ELEM_SMOOTH  = (1 << 3), /* used for faces and edges, note from the user POV,
-                                  * this is a sharp edge when disabled */
-
-       BM_ELEM_TAG     = (1 << 4), /* internal flag, used for ensuring correct normals
-                                 * during multires interpolation, and any other time
-                                 * when temp tagging is handy.
-                                 * always assume dirty & clear before use. */
-
-       /* we have 2 spare flags which is awesome but since we're limited to 8
-        * only add new flags with care! - campbell */
-       /* BM_ELEM_SPARE  = (1 << 5), */
-       /* BM_ELEM_SPARE  = (1 << 6), */
-
-       BM_ELEM_INTERNAL_TAG = (1 << 7) /* for low level internal API tagging,
-                                     * since tools may want to tag verts and
-                                     * not have functions clobber them */
-};
-
-/* Mesh Level Ops */
-extern int bm_mesh_allocsize_default[4];
-
-
 /* ------------------------------------------------------------------------- */
 /* bmesh_inline.c */
 
index f071e00211c9f885e8ecf98ac153af7b3a8ae974..1c7717ac5f008e803c22921e6c20031e38f56d67 100644 (file)
@@ -47,6 +47,19 @@ struct Object;
  *
  * hrm. it doesnt but stull works ok, remove the comment above? - campbell.
  */
+
+/**
+ * BMHeader
+ *
+ * All mesh elements begin with a BMHeader. This structure
+ * hold several types of data
+ *
+ * 1: The type of the element (vert, edge, loop or face)
+ * 2: Persistant "header" flags/markings (smooth, seam, select, hidden, ect)
+ *     note that this is different from the "tool" flags.
+ * 3: Unique ID in the bmesh.
+ * 4: some elements for internal record keeping.
+ */
 typedef struct BMHeader {
        void *data; /* customdata layers */
        int index; /* notes:
@@ -188,4 +201,37 @@ typedef struct BMesh {
        int opflag; /* current operator flag */
 } BMesh;
 
+/* BMHeader->htype (char) */
+enum {
+       BM_VERT = 1,
+       BM_EDGE = 2,
+       BM_LOOP = 4,
+       BM_FACE = 8
+};
+
+#define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
+
+/* BMHeader->hflag (char) */
+enum {
+       BM_ELEM_SELECT  = (1 << 0),
+       BM_ELEM_HIDDEN  = (1 << 1),
+       BM_ELEM_SEAM    = (1 << 2),
+       BM_ELEM_SMOOTH  = (1 << 3), /* used for faces and edges, note from the user POV,
+                                  * this is a sharp edge when disabled */
+
+       BM_ELEM_TAG     = (1 << 4), /* internal flag, used for ensuring correct normals
+                                 * during multires interpolation, and any other time
+                                 * when temp tagging is handy.
+                                 * always assume dirty & clear before use. */
+
+       /* we have 2 spare flags which is awesome but since we're limited to 8
+        * only add new flags with care! - campbell */
+       /* BM_ELEM_SPARE  = (1 << 5), */
+       /* BM_ELEM_SPARE  = (1 << 6), */
+
+       BM_ELEM_INTERNAL_TAG = (1 << 7) /* for low level internal API tagging,
+                                     * since tools may want to tag verts and
+                                     * not have functions clobber them */
+};
+
 #endif /* __BMESH_CLASS_H__ */
index c4fbae4da8e18ff31d68bb8043fbd7b687f43533..04cca767d9e01e30ec2f568386bd71fb4ae73034 100644 (file)
 extern "C" {
 #endif
 
-#include "BLI_memarena.h"
 #include "BLI_ghash.h"
 
-#include "BKE_utildefines.h"
-
 #include <stdarg.h>
-#include <string.h> /* for memcpy */
 
 /*
  * operators represent logical, executable mesh modules.  all topological
@@ -140,7 +136,7 @@ typedef struct BMOperator {
        int needflag;
        int flag;
        struct BMOpSlot slots[BMO_OP_MAX_SLOTS]; void (*exec)(BMesh *bm, struct BMOperator *op);
-       MemArena *arena;
+       struct MemArena *arena;
 } BMOperator;
 
 #define MAX_SLOTNAME   32
index 7ff8fd0b7f42b0c96a8e7daaff47d13884f227c4..a0fd3ec9250c372b934e7356292860d9ae603794 100644 (file)
@@ -589,17 +589,17 @@ BMesh *BM_mesh_copy(BMesh *bmold)
        int i, j;
 
        /* allocate a bmesh */
-       bm = BM_mesh_create(bmold->ob, bm_mesh_allocsize_default);
+       bm = BM_mesh_create(bmold->ob, &bm_mesh_allocsize_default);
 
        CustomData_copy(&bmold->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&bmold->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&bmold->ldata, &bm->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&bmold->pdata, &bm->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
 
-       CustomData_bmesh_init_pool(&bm->vdata, bm_mesh_allocsize_default[0]);
-       CustomData_bmesh_init_pool(&bm->edata, bm_mesh_allocsize_default[1]);
-       CustomData_bmesh_init_pool(&bm->ldata, bm_mesh_allocsize_default[2]);
-       CustomData_bmesh_init_pool(&bm->pdata, bm_mesh_allocsize_default[3]);
+       CustomData_bmesh_init_pool(&bm->vdata, bm_mesh_allocsize_default.totvert);
+       CustomData_bmesh_init_pool(&bm->edata, bm_mesh_allocsize_default.totedge);
+       CustomData_bmesh_init_pool(&bm->ldata, bm_mesh_allocsize_default.totloop);
+       CustomData_bmesh_init_pool(&bm->pdata, bm_mesh_allocsize_default.totface);
 
        vtable = MEM_mallocN(sizeof(BMVert *) * bmold->totvert, "BM_mesh_copy vtable");
        etable = MEM_mallocN(sizeof(BMEdge *) * bmold->totedge, "BM_mesh_copy etable");
index 98436640b1186fe33362210dc955f1e10e0cf3b7..8778dad421fe476834a244602165ed04fe0a5816 100644 (file)
 #include "bmesh_private.h"
 
 /* used as an extern, defined in bmesh.h */
-int bm_mesh_allocsize_default[4] = {512, 512, 2048, 512};
+BMAllocTemplate bm_mesh_allocsize_default = {512, 512, 2048, 512};
 
-static void bm_mempool_init(BMesh *bm, const int allocsize[4])
+static void bm_mempool_init(BMesh *bm, const BMAllocTemplate *allocsize)
 {
-       bm->vpool =        BLI_mempool_create(sizeof(BMVert),     allocsize[0], allocsize[0], FALSE, TRUE);
-       bm->epool =        BLI_mempool_create(sizeof(BMEdge),     allocsize[1], allocsize[1], FALSE, TRUE);
-       bm->lpool =        BLI_mempool_create(sizeof(BMLoop),     allocsize[2], allocsize[2], FALSE, FALSE);
-       bm->fpool =        BLI_mempool_create(sizeof(BMFace),     allocsize[3], allocsize[3], FALSE, TRUE);
+       bm->vpool =        BLI_mempool_create(sizeof(BMVert),     allocsize->totvert, allocsize->totvert, FALSE, TRUE);
+       bm->epool =        BLI_mempool_create(sizeof(BMEdge),     allocsize->totedge, allocsize->totedge, FALSE, TRUE);
+       bm->lpool =        BLI_mempool_create(sizeof(BMLoop),     allocsize->totloop, allocsize->totloop, FALSE, FALSE);
+       bm->fpool =        BLI_mempool_create(sizeof(BMFace),     allocsize->totface, allocsize->totface, FALSE, TRUE);
 
 #ifdef USE_BMESH_HOLES
        bm->looplistpool = BLI_mempool_create(sizeof(BMLoopList), allocsize[3], allocsize[3], FALSE, FALSE);
@@ -70,7 +70,7 @@ static void bm_mempool_init(BMesh *bm, const int allocsize[4])
  *
  * \note ob is needed by multires
  */
-BMesh *BM_mesh_create(struct Object *ob, const int allocsize[4])
+BMesh *BM_mesh_create(struct Object *ob, BMAllocTemplate *allocsize)
 {
        /* allocate the structure */
        BMesh *bm = MEM_callocN(sizeof(BMesh), __func__);
@@ -173,7 +173,7 @@ void BM_mesh_clear(BMesh *bm)
        bm->ob = ob;
        
        /* allocate the memory pools for the mesh elements */
-       bm_mempool_init(bm, bm_mesh_allocsize_default);
+       bm_mempool_init(bm, &bm_mesh_allocsize_default);
 
        bm->stackdepth = 1;
        bm->totflags = 1;
index 373b530894aaa69f4ee481a2f6921aaa0d7a1d16..ea80696a85528a594ecff012044b70056ea37c62 100644 (file)
@@ -27,7 +27,9 @@
  *  \ingroup bmesh
  */
 
-BMesh *BM_mesh_create(struct Object *ob, const int allocsize[4]);
+struct BMAllocTemplate;
+
+BMesh *BM_mesh_create(struct Object *ob, struct BMAllocTemplate *allocsize);
 
 void   BM_mesh_free(BMesh *bm);
 void   BM_mesh_data_free(BMesh *bm);
@@ -46,4 +48,10 @@ BMVert *BM_vert_at_index(BMesh *bm, const int index);
 BMEdge *BM_edge_at_index(BMesh *bm, const int index);
 BMFace *BM_face_at_index(BMesh *bm, const int index);
 
+typedef struct BMAllocTemplate {
+       int totvert, totedge, totloop, totface;
+} BMAllocTemplate;
+
+extern BMAllocTemplate bm_mesh_allocsize_default;
+
 #endif /* __BMESH_MESH_H__ */
index a7c8f1612eb792a3c18dfacd4b1fe7baf1cdf98d..5b88d9f1b96e0e111c6c8b4bef06da9306c224b6 100644 (file)
@@ -94,14 +94,9 @@ BM_INLINE void BMO_slot_map_ptr_insert(BMesh *bm, BMOperator *op, const char *sl
 BM_INLINE int BMO_slot_map_contains(BMesh *UNUSED(bm), BMOperator *op, const char *slotname, void *element)
 {
        BMOpSlot *slot = BMO_slot_get(op, slotname);
+       BLI_assert(slot->slottype == BMO_OP_SLOT_MAPPING);
 
-       /*sanity check*/
-       if (slot->slottype != BMO_OP_SLOT_MAPPING) {
-#ifdef DEBUG
-               printf("%s: invalid type %d\n", __func__, slot->slottype);
-#endif
-               return 0;
-       }
+       /* sanity check */
        if (!slot->data.ghash) return 0;
 
        return BLI_ghash_haskey(slot->data.ghash, element);
@@ -112,14 +107,9 @@ BM_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const c
 {
        BMOElemMapping *mapping;
        BMOpSlot *slot = BMO_slot_get(op, slotname);
+       BLI_assert(slot->slottype == BMO_OP_SLOT_MAPPING);
 
-       /*sanity check*/
-       if (slot->slottype != BMO_OP_SLOT_MAPPING) {
-#ifdef DEBUG
-               printf("%s: invalid type %d\n", __func__, slot->slottype);
-#endif
-               return NULL;
-       }
+       /* sanity check */
        if (!slot->data.ghash) return NULL;
 
        mapping = (BMOElemMapping *)BLI_ghash_lookup(slot->data.ghash, element);
@@ -132,7 +122,7 @@ BM_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const c
 BM_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *slotname,
                                        void *element)
 {
-       float *val = (float*) BMO_slot_map_data_get(bm, op, slotname, element);
+       float *val = (float *) BMO_slot_map_data_get(bm, op, slotname, element);
        if (val) return *val;
 
        return 0.0f;
@@ -141,7 +131,7 @@ BM_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *sl
 BM_INLINE int BMO_slot_map_int_get(BMesh *bm, BMOperator *op, const char *slotname,
                                    void *element)
 {
-       int *val = (int*) BMO_slot_map_data_get(bm, op, slotname, element);
+       int *val = (int *) BMO_slot_map_data_get(bm, op, slotname, element);
        if (val) return *val;
 
        return 0;
index 3116de3922b24b69b77d97eed24ea37e1d184ee0..f18a0835e5e6dd6113ef628a6ff7ae913dd8e195 100644 (file)
@@ -27,8 +27,7 @@
  */
 
 #include <stdlib.h>
-
-
+#include <string.h> /* for memcpy */
 
 #include "BLI_listbase.h"
 
index 2d8f99475d608df24e76959a8d6c2186289cc995..162992f7df88cb128a0888bd1f145f6c2fd47d62 100644 (file)
@@ -174,12 +174,14 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
                }
        }
 
-       if (BMO_error_occurred(bm)) goto cleanup;
+       if (BMO_error_occurred(bm)) {
+               goto cleanup;
+       }
 
        BMO_slot_buffer_from_flag(bm, op, "regionout", FACE_NEW, BM_FACE);
 
 cleanup:
-       /* free/cleanu */
+       /* free/cleanup */
        for (i = 0; i < BLI_array_count(regions); i++) {
                if (regions[i]) MEM_freeN(regions[i]);
        }
index 7c8192d1ccf49dd6885a4b3c1d77ce9f938d73e1..5c800ba083af6a59d23c93a559d9bc1dca6d5138 100644 (file)
@@ -440,7 +440,7 @@ void bmo_split_exec(BMesh *bm, BMOperator *op)
        BMO_slot_copy(&dupeop, splitop, "isovertmap",
                      "isovertmap");
        
-       /* cleanu */
+       /* cleanup */
        BMO_op_finish(bm, &delop);
        BMO_op_finish(bm, &dupeop);
 }
index 4d4d429a2373d9a63cb9455cbce3b28ae66d68a4..059ee882fb8bafb05358b1d16304b7f572d26383 100644 (file)
@@ -20,6 +20,8 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include <string.h> /* for memcpy */
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_array.h"
index 27a1b5459edc64a1096bbb3f9bdd1a9816b3fb35..9cab8cd5f91181305e30e34d71de5eec085d295d 100644 (file)
@@ -137,10 +137,10 @@ void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op)
                printf("shapekey <-> mesh mismatch!\n");
        }
        
-       CustomData_bmesh_init_pool(&bm->vdata, bm_mesh_allocsize_default[0]);
-       CustomData_bmesh_init_pool(&bm->edata, bm_mesh_allocsize_default[1]);
-       CustomData_bmesh_init_pool(&bm->ldata, bm_mesh_allocsize_default[2]);
-       CustomData_bmesh_init_pool(&bm->pdata, bm_mesh_allocsize_default[3]);
+       CustomData_bmesh_init_pool(&bm->vdata, bm_mesh_allocsize_default.totvert);
+       CustomData_bmesh_init_pool(&bm->edata, bm_mesh_allocsize_default.totedge);
+       CustomData_bmesh_init_pool(&bm->ldata, bm_mesh_allocsize_default.totloop);
+       CustomData_bmesh_init_pool(&bm->pdata, bm_mesh_allocsize_default.totface);
 
        for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
                v = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL);
index 31892cc0663ba14007434c14d0a9f13be7111cd0..09e88b77323bb651354f2ec64183f739668b515f 100644 (file)
@@ -39,6 +39,7 @@
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
 #include "BLI_ghash.h"
+#include "BLI_memarena.h"
 
 #include "bmesh.h"
 #include "bmesh_private.h"
index cf30af4f7e2189bd7fa399f0e2d37e1d3bb8364d..8cf798e4a4ac77665e906259b69e8b9f92485a09 100644 (file)
@@ -3206,16 +3206,16 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO
        if (!em)
                return OPERATOR_CANCELLED;
                
-       bmnew = BM_mesh_create(obedit, bm_mesh_allocsize_default);
+       bmnew = BM_mesh_create(obedit, &bm_mesh_allocsize_default);
        CustomData_copy(&em->bm->vdata, &bmnew->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&em->bm->edata, &bmnew->edata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&em->bm->ldata, &bmnew->ldata, CD_MASK_BMESH, CD_CALLOC, 0);
        CustomData_copy(&em->bm->pdata, &bmnew->pdata, CD_MASK_BMESH, CD_CALLOC, 0);
 
-       CustomData_bmesh_init_pool(&bmnew->vdata, bm_mesh_allocsize_default[0]);
-       CustomData_bmesh_init_pool(&bmnew->edata, bm_mesh_allocsize_default[1]);
-       CustomData_bmesh_init_pool(&bmnew->ldata, bm_mesh_allocsize_default[2]);
-       CustomData_bmesh_init_pool(&bmnew->pdata, bm_mesh_allocsize_default[3]);
+       CustomData_bmesh_init_pool(&bmnew->vdata, bm_mesh_allocsize_default.totvert);
+       CustomData_bmesh_init_pool(&bmnew->edata, bm_mesh_allocsize_default.totedge);
+       CustomData_bmesh_init_pool(&bmnew->ldata, bm_mesh_allocsize_default.totloop);
+       CustomData_bmesh_init_pool(&bmnew->pdata, bm_mesh_allocsize_default.totface);
                
        basenew = ED_object_add_duplicate(bmain, scene, editbase, USER_DUP_MESH);       /* 0 = fully linked */
        assign_matarar(basenew->object, give_matarar(obedit), *give_totcolp(obedit)); /* new in 2.5 */
index e5c79150dab99f1f484a71cbdf68600790441690..830534e331521aefeae940ee96d266985c8a11df 100644 (file)
@@ -546,7 +546,7 @@ static void undoMesh_to_editbtMesh(void *umv, void *emv, void *UNUSED(obdata))
 
        BMEdit_Free(em);
 
-       bm = BM_mesh_create(ob, bm_mesh_allocsize_default);
+       bm = BM_mesh_create(ob, &bm_mesh_allocsize_default);
        BMO_op_callf(bm, "mesh_to_bmesh mesh=%p object=%p set_shapekey=%b", &um->me, ob, FALSE);
 
        em2 = BMEdit_Create(bm, TRUE);
index bc2f01a24838acb981660db11a911ce89badd956..ba0067faaaa4f90d45a94137cd6dbebbe1190ae7 100644 (file)
 
 #include "MEM_guardedalloc.h"
 
-
 #include "BLI_blenlib.h"
 #include "BLI_array.h"
 #include "BLI_math.h"
 #include "BLI_rand.h"
 #include "BLI_smallhash.h"
 #include "BLI_scanfill.h"
+#include "BLI_memarena.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_context.h"