MOAB: Mesh Oriented datABase  (version 5.4.0)
test_entset.cpp
Go to the documentation of this file.
00001 #include "iGeom.h"
00002 #include "iMesh.h"
00003 #include "iRel.h"
00004 
00005 #include <cstdio>
00006 #include <cstdlib>
00007 #include <cstring>
00008 
00009 // clang-format off
00010 
00011 #define STRINGIFY_( X ) #X
00012 #define STRINGIFY( X )  STRINGIFY_( X )
00013 #ifdef MESHDIR
00014 #ifdef HAVE_OCC
00015 #define DEFAULT_GEOM STRINGIFY( MESHDIR/irel/brick.stp )
00016 #define DEFAULT_MESH STRINGIFY( MESHDIR/irel/brick.h5m )
00017 #else
00018 #define DEFAULT_GEOM STRINGIFY( MESHDIR/irel/brick.facet )
00019 #define DEFAULT_MESH STRINGIFY( MESHDIR/irel/brick.h5m )
00020 #endif
00021 #else
00022 #error Specify MESHDIR to compile test
00023 #endif
00024 
00025 #define CHECK_SIZE_C( type, array, allocated_size, size )            \
00026     if( NULL == *(array) || *(allocated_size) == 0 )                     \
00027     {                                                                \
00028         *(array)          = (type*)malloc( sizeof( type ) * (size) );    \
00029         *(allocated_size) = size;                                      \
00030     }                                                                \
00031     else if( *(allocated_size) < (size) )                                \
00032     {                                                                \
00033         printf( "   Array passed in is non-zero but too short.\n" ); \
00034     }
00035 
00036 // clang-format on
00037 
00038 typedef void* iRel_EntityHandle;
00039 
00040 /*!
00041   prints out a result string based on the value of error_code
00042 */
00043 void handle_error_code( const int result, int* number_failed, int* /*number_not_implemented*/, int* number_successful )
00044 {
00045     if( result )
00046     {
00047         printf( "Success" );
00048         ( *number_successful )++;
00049     }
00050     else
00051     {
00052         printf( "Failure" );
00053         ( *number_failed )++;
00054     }
00055 }
00056 
00057 int print_geom_info( iGeom_Instance geom, iBase_EntityHandle gent )
00058 {
00059     /* print information about this entity */
00060     int ent_type;
00061     int result;
00062     const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
00063 
00064     iGeom_getEntType( geom, gent, &ent_type, &result );
00065 
00066     if( iBase_SUCCESS != result )
00067     {
00068         printf( "Trouble getting entity adjacencies or types." );
00069         return 0;
00070     }
00071 
00072     printf( "%s 0x%lx\n", type_names[ent_type], (unsigned long)gent );
00073 
00074     return 1;
00075 }
00076 
00077 int print_mesh_info( iMesh_Instance mesh, iBase_EntityHandle ment )
00078 {
00079     /* print information about this entity */
00080 
00081     /* get adjacencies first; assume not more than 50 */
00082     iBase_EntityHandle adj_ents[50], *adj_ents_ptr = adj_ents;
00083     int ent_types[50], *ent_types_ptr              = ent_types;
00084     int adj_ents_alloc = 50, adj_ents_size, ent_types_size, ent_types_allocated = 50;
00085     int result;
00086 
00087     iBase_TagHandle* ment_tags = NULL;
00088     int ment_tags_size, ment_tags_alloc;
00089 
00090     char** tag_names;
00091     int i;
00092 
00093     const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
00094 
00095     iMesh_getEntAdj( mesh, ment, iBase_ALL_TYPES, &adj_ents_ptr, &adj_ents_alloc, &adj_ents_size, &result );
00096 
00097     if( iBase_SUCCESS != result ) return 0;
00098 
00099     /* put this ent on the end, then get types */
00100     adj_ents[adj_ents_size] = ment;
00101     iMesh_getEntArrType( mesh, adj_ents, adj_ents_size + 1, &ent_types_ptr, &ent_types_allocated, &ent_types_size,
00102                          &result );
00103     if( iBase_SUCCESS != result )
00104     {
00105         printf( "Trouble getting entity adjacencies or types." );
00106         return 0;
00107     }
00108 
00109     /* get tags on ment */
00110     iMesh_getAllTags( mesh, ment, &ment_tags, &ment_tags_alloc, &ment_tags_size, &result );
00111 
00112     printf( "Trouble getting tags on an entity or their names." );
00113 
00114     /* while we're at it, get all the tag names */
00115 
00116     tag_names = (char**)malloc( ment_tags_size * sizeof( char* ) );
00117 
00118     for( i = 0; i < ment_tags_size; i++ )
00119     {
00120         tag_names[i] = (char*)malloc( 120 * sizeof( char ) );
00121         iMesh_getTagName( mesh, ment_tags[i], tag_names[i], &result, 120 );
00122     }
00123 
00124     /* now print the information */
00125     printf( "%s %ld:\n", type_names[ent_types[ent_types_size - 1]], (long)ment );
00126     printf( "Adjacencies:" );
00127     for( i = 0; i < adj_ents_size; i++ )
00128     {
00129         if( i > 0 ) printf( ", " );
00130         printf( "%s %ld", type_names[ent_types[i]], (long)adj_ents[i] );
00131     }
00132     printf( "\nTags: \n" );
00133     for( i = 0; i < ment_tags_size; i++ )
00134     {
00135         int tag_type;
00136 
00137         printf( "%s ", tag_names[i] );
00138         iMesh_getTagType( mesh, ment_tags[i], &tag_type, &result );
00139         if( iBase_SUCCESS != result )
00140             printf( "(trouble getting type...)\n" );
00141         else
00142         {
00143             char* dum_handle     = NULL;
00144             int dum_handle_alloc = 0, dum_handle_size = 0;
00145             int int_data;
00146             double dbl_data;
00147             iBase_EntityHandle eh_data;
00148 
00149             switch( tag_type )
00150             {
00151                 case iBase_INTEGER:
00152                     iMesh_getIntData( mesh, ment, ment_tags[i], &int_data, &result );
00153                     printf( "(Int value=%d)", int_data );
00154                     break;
00155                 case iBase_DOUBLE:
00156                     iMesh_getDblData( mesh, ment, ment_tags[i], &dbl_data, &result );
00157                     printf( "(Dbl value=%f)", dbl_data );
00158                     break;
00159                 case iBase_ENTITY_HANDLE:
00160                     iMesh_getEHData( mesh, ment, ment_tags[i], &eh_data, &result );
00161                     printf( "(EH value=%ld)", (long)eh_data );
00162                     break;
00163                 case iBase_BYTES:
00164                     iMesh_getData( mesh, ment, ment_tags[i], (void**)&dum_handle, &dum_handle_alloc, &dum_handle_size,
00165                                    &result );
00166                     if( NULL != dum_handle && dum_handle_size > 0 ) printf( "(Opaque value=%c)", dum_handle[0] );
00167                     break;
00168             }
00169         }
00170 
00171         printf( "\n" );
00172     }
00173     printf( "(end tags)\n\n" );
00174     free( ment_tags );
00175 
00176     return 1;
00177 }
00178 
00179 /*!
00180   @test
00181   Load Mesh
00182   @li Load a geom and a mesh file
00183 */
00184 int load_geom_mesh_test( const char* geom_filename,
00185                          const char* mesh_filename,
00186                          iGeom_Instance geom,
00187                          iMesh_Instance mesh )
00188 {
00189     /* load a geom */
00190     int result;
00191     iGeom_load( geom, geom_filename, 0, &result, strlen( geom_filename ), 0 );
00192     if( iBase_SUCCESS != result )
00193     {
00194         printf( "ERROR : can not load a geometry\n" );
00195         return 0;
00196     }
00197 
00198     /* load a mesh */
00199     iMesh_load( mesh, 0, mesh_filename, 0, &result, strlen( mesh_filename ), 0 );
00200     if( iBase_SUCCESS != result )
00201     {
00202         printf( "ERROR : can not load a mesh\n" );
00203         return 0;
00204     }
00205 
00206     return 1;
00207 }
00208 
00209 /*!
00210   @test
00211   TSTTLasso create relation  Test
00212   @li Create relation between geom and mesh
00213 */
00214 int create_relation_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle* pair )
00215 {
00216     int result;
00217     iBase_Instance iface1, iface2;
00218     int type1, type2;
00219     int ent_or_set1, ent_or_set2;
00220     int status1, status2;
00221 
00222     iRel_PairHandle tmp_pair;
00223     iRel_PairHandle* pair_ptr = &tmp_pair;
00224     int pairs_alloc           = 1, pairs_size;
00225 
00226     /* create an relation, entity to set */
00227     iRel_createPair( assoc, geom, iRel_ENTITY, iRel_IGEOM_IFACE, iRel_ACTIVE, mesh, iRel_SET, iRel_IMESH_IFACE,
00228                      iRel_ACTIVE, pair, &result );
00229     if( iBase_SUCCESS != result )
00230     {
00231         printf( "Couldn't create a new relation.\n" );
00232         return 0;
00233     }
00234 
00235     iRel_getPairInfo( assoc, *pair, &iface1, &ent_or_set1, &type1, &status1, &iface2, &ent_or_set2, &type2, &status2,
00236                       &result );
00237     if( iBase_SUCCESS != result )
00238     {
00239         printf( "Couldn't retrieve relation info.\n" );
00240         return 0;
00241     }
00242     if( iface1 != geom || ent_or_set1 != iRel_ENTITY || type1 != iRel_IGEOM_IFACE || iface2 != mesh ||
00243         ent_or_set2 != iRel_SET || type2 != iRel_IMESH_IFACE )
00244     {
00245         printf( "Unexpected relation info returned.\n" );
00246         return 0;
00247     }
00248 
00249     iRel_findPairs( assoc, geom, &pair_ptr, &pairs_alloc, &pairs_size, &result );
00250     if( iBase_SUCCESS != result )
00251     {
00252         printf( "Couldn't find relation pair when querying geom.\n" );
00253         return 0;
00254     }
00255     if( pairs_size != 1 || tmp_pair != *pair )
00256     {
00257         printf( "Unexpected relation pairs returned when querying geom.\n" );
00258         return 0;
00259     }
00260 
00261     iRel_findPairs( assoc, mesh, &pair_ptr, &pairs_alloc, &pairs_size, &result );
00262     if( iBase_SUCCESS != result )
00263     {
00264         printf( "Couldn't find relation pair when querying mesh.\n" );
00265         return 0;
00266     }
00267     if( pairs_size != 1 || tmp_pair != *pair )
00268     {
00269         printf( "Unexpected relation pairs returned when querying mesh.\n" );
00270         return 0;
00271     }
00272 
00273     return 1;
00274 }
00275 
00276 /*!
00277   @test
00278   TSTTLasso relate geom and mesh Test
00279   @li Check relation between geom and mesh
00280 */
00281 int relate_geom_mesh_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
00282 {
00283     int result;
00284 
00285     iBase_EntityHandle* gentities = NULL;
00286     int gentities_size = 0, gentities_alloc = 0;
00287 
00288     iBase_EntitySetHandle* mentity_handles = NULL;
00289     int mentity_handles_size = 0, mentity_handles_alloc = 0;
00290 
00291     const char* dim_tag_name = "GEOM_DIMENSION";
00292     iBase_TagHandle dim_tag_mesh;
00293 
00294     iBase_EntitySetHandle* mentities_vec;
00295     int mentities_vec_size = 0;
00296     int i;
00297 
00298     iBase_EntitySetHandle* out_mentities = NULL;
00299     int out_mentities_size = 0, out_mentities_alloc = 0;
00300 
00301     iBase_EntitySetHandle* out_mentities2 = NULL;
00302     int out_mentities2_size = 0, out_mentities2_alloc = 0;
00303 
00304     iBase_EntityHandle* out_gentities = NULL;
00305     int out_gentities_size = 0, out_gentities_alloc = 0;
00306 
00307     /* relate geometry entities with coresponding mesh entity sets */
00308     iGeom_getEntities( geom, NULL, iBase_VERTEX, &gentities, &gentities_alloc, &gentities_size, &result );
00309     if( iBase_SUCCESS != result )
00310     {
00311         printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
00312         return 0;
00313     }
00314 
00315     iRel_inferEntArrRelations( assoc, pair, gentities, gentities_size, 0, &result );
00316     if( iBase_SUCCESS != result )
00317     {
00318         printf( "Failed to relate geom entities in relate_geom_mesh_test.\n" );
00319         return 0;
00320     }
00321 
00322     /* relate coresponding mesh entity sets for geometry entities */
00323     /* get 1-dimensional mesh entitysets */
00324     iMesh_getEntSets( mesh, NULL, 1, &mentity_handles, &mentity_handles_alloc, &mentity_handles_size, &result );
00325     if( iBase_SUCCESS != result )
00326     {
00327         printf( "Problem to get all entity sets.\n" );
00328         return 0;
00329     }
00330 
00331     /* get geom dimension tags for mesh entitysets */
00332     iMesh_createTag( mesh, dim_tag_name, 1, iBase_INTEGER, &dim_tag_mesh, &result, 15 );
00333     if( iBase_SUCCESS != result && result != iBase_TAG_ALREADY_EXISTS )
00334     {
00335         printf( "Couldn't create geom dim tag for mesh entities.\n" );
00336         return 0;
00337     }
00338 
00339     /* get 1-dimensional mesh entitysets */
00340     mentities_vec = (iBase_EntitySetHandle*)malloc( mentity_handles_size * sizeof( iBase_EntitySetHandle ) );
00341     for( i = 0; i < mentity_handles_size; i++ )
00342     { /* test */
00343         int dim;
00344         iMesh_getEntSetIntData( mesh, mentity_handles[i], dim_tag_mesh, &dim, &result );
00345         if( iBase_SUCCESS != result ) continue;
00346 
00347         if( dim == 1 ) mentities_vec[mentities_vec_size++] = mentity_handles[i];
00348     }
00349 
00350     iRel_inferSetArrRelations( assoc, pair, mentities_vec, mentities_vec_size, 1, &result );
00351     if( iBase_SUCCESS != result )
00352     {
00353         printf( "Failed to relate mesh entities in relate_geom_mesh_test.\n" );
00354         return 0;
00355     }
00356 
00357     /* relate all geometry and mesh entities */
00358     iRel_inferAllRelations( assoc, pair, &result );
00359     if( iBase_SUCCESS != result )
00360     {
00361         printf( "Failed to relate all geom and mesh entities in relate_geom_mesh_test.\n" );
00362         return 0;
00363     }
00364 
00365     /* reset geom entities list and get all geom entities (prev
00366        only vertices) */
00367     free( gentities );
00368     gentities       = NULL;
00369     gentities_alloc = 0;
00370     iGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
00371     if( iBase_SUCCESS != result )
00372     {
00373         printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
00374         return 0;
00375     }
00376 
00377     /* get related mesh entity sets for geometry entities */
00378     iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
00379                                   &out_mentities_size, &result );
00380     if( iBase_SUCCESS != result )
00381     {
00382         printf( "Failed to get geom entities in relate_geom_mesh_test.\n" );
00383         return 0;
00384     }
00385 
00386     if( out_mentities_size != gentities_size )
00387     {
00388         printf( "Number of input geom entities and output mesh entity sets should be same\n" );
00389         return 0;
00390     }
00391 
00392     /* now try deleting this relation */
00393     iRel_rmvEntArrRelation( assoc, pair, gentities, gentities_size, 0, &result );
00394     if( iBase_SUCCESS != result )
00395     {
00396         printf( "Failed to remove relation in relate_geom_mesh_test.\n" );
00397         return 0;
00398     }
00399 
00400     iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities2, &out_mentities2_alloc,
00401                                   &out_mentities2_size, &result );
00402     if( iBase_SUCCESS == result )
00403     {
00404         printf( "Shouldn't have gotten mesh sets in relate_geom_mesh_test.\n" );
00405         return 0;
00406     }
00407 
00408     /* restore the relation, since we need it later */
00409     iRel_setEntArrSetArrRelation( assoc, pair, gentities, gentities_size, out_mentities, out_mentities_size, &result );
00410     if( iBase_SUCCESS != result )
00411     {
00412         printf( "Failed to restore relation in relate_geom_mesh_test.\n" );
00413         return 0;
00414     }
00415 
00416     /* get related geometry entities for mesh entity sets */
00417     iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
00418                                   &out_gentities_alloc, &out_gentities_size, &result );
00419     if( iBase_SUCCESS != result )
00420     {
00421         printf( "Failed to get mesh entities in relate_geom_mesh_test.\n" );
00422         return 0;
00423     }
00424 
00425     if( out_mentities_size != out_gentities_size )
00426     {
00427         printf( "Number of input mesh entity sets and output geom entities should be same\n" );
00428         return 0;
00429     }
00430     free( mentity_handles );
00431     mentity_handles = NULL;
00432     free( gentities );
00433     gentities = NULL;
00434     free( mentity_handles );
00435     mentity_handles = NULL;
00436     free( out_mentities );
00437     out_mentities = NULL;
00438     free( mentities_vec );
00439     mentities_vec = NULL;
00440     free( out_gentities );
00441     out_gentities = NULL;
00442     return 1;
00443 }
00444 
00445 /*!
00446   @test
00447   TSTTAssoc move to test
00448   @li Move meshes onto the given geometry
00449 */
00450 int query_relations_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
00451 {
00452     int result;
00453     int i;
00454 
00455     iBase_EntityHandle* gentities = NULL;
00456     int gentities_size = 0, gentities_alloc = 0;
00457 
00458     iBase_EntitySetHandle* out_mentities = NULL;
00459     int out_mentities_size, out_mentities_alloc = 0;
00460 
00461     iBase_EntityHandle* out_gentities = NULL;
00462     int out_gentities_size, out_gentities_alloc = 0;
00463 
00464     /* get all the geom entities, and find relation to some mesh entity */
00465     iGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
00466     if( iBase_SUCCESS != result )
00467     {
00468         printf( "Problem getting all geom entities.\n" );
00469         return 0;
00470     }
00471 
00472     iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
00473                                   &out_mentities_size, &result );
00474     /* might not all be */
00475     if( iBase_SUCCESS != result )
00476     {
00477         char descr[120];
00478 
00479         printf( "Failed to get mesh entities related to geom entities in query_relations_test.\n" );
00480 
00481         iRel_getDescription( assoc, descr, sizeof( descr ) - 1 );
00482         printf( "Entities missing relations: %s\n", descr );
00483 
00484         for( i = 0; i < gentities_size; i++ )
00485         {
00486             print_geom_info( geom, gentities[i] );
00487         }
00488 
00489         return 0;
00490     }
00491 
00492     /* check that they're all non-null */
00493     if( out_mentities_size != gentities_size )
00494     {
00495         printf( "Number of mesh & related geom entities don't match.\n" );
00496         return 0;
00497     }
00498 
00499     /* check to make sure they're mesh sets; how to do that? */
00500     for( i = 0; i < out_mentities_size; i++ )
00501     {
00502         int is_list;
00503         iMesh_isList( mesh, (iBase_EntitySetHandle)out_mentities[i], &is_list, &result );
00504         if( iBase_SUCCESS != result )
00505         {
00506             printf( "Entity set returned from classification wasn't valid.\n" );
00507             return 0;
00508         }
00509     }
00510 
00511     /* now turn around and check classification of those mesh entities */
00512     iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
00513                                   &out_gentities_alloc, &out_gentities_size, &result );
00514     if( iBase_SUCCESS != result )
00515     {
00516         printf( "Failed to get geom entities related to mesh entities in query_relations_test.\n" );
00517         return 0;
00518     }
00519 
00520     /* check that they're all non-null */
00521     if( out_mentities_size != out_gentities_size )
00522     {
00523         printf( "Number of geom & related mesh entities don't match.\n" );
00524         return 0;
00525     }
00526 
00527     free( gentities );
00528     gentities = NULL;
00529     free( out_mentities );
00530     out_mentities = NULL;
00531     free( out_gentities );
00532     out_gentities = NULL;
00533     /* ok, we're done */
00534     return 1;
00535 }
00536 
00537 int main( int argc, char* argv[] )
00538 {
00539     /* Check command line arg */
00540     const char* geom_filename = DEFAULT_GEOM;
00541     const char* mesh_filename = DEFAULT_MESH;
00542 
00543     int result;
00544     int number_tests                 = 0;
00545     int number_tests_successful      = 0;
00546     int number_tests_not_implemented = 0;
00547     int number_tests_failed          = 0;
00548 
00549     iGeom_Instance geom;
00550     iMesh_Instance mesh;
00551     iRel_Instance assoc;
00552     iRel_PairHandle pair;
00553 
00554     printf( "Usage: %s %s\n", geom_filename, mesh_filename );
00555 
00556     if( argc == 2 && !strcmp( argv[1], "-h" ) )
00557     {
00558         printf( "Usage: %s <geom_filename> <mesh_filename>\n", argv[0] );
00559         return 1;
00560     }
00561     else if( argc == 2 )
00562     {
00563         geom_filename = argv[1];
00564         mesh_filename = argv[1];
00565     }
00566     else if( argc == 3 )
00567     {
00568         geom_filename = argv[1];
00569         mesh_filename = argv[2];
00570     }
00571 
00572     /* initialize the Geometry */
00573     iGeom_newGeom( 0, &geom, &result, 0 );
00574 
00575     /* initialize the Mesh */
00576     iMesh_newMesh( 0, &mesh, &result, 0 );
00577 
00578     /* initialize the Associate */
00579     iRel_create( 0, &assoc, &result, 0 );
00580 
00581     /* Print out Header information */
00582     printf( "\n\niRel TEST PROGRAM:\n\n" );
00583 
00584     /* load_geom_mesh test */
00585     printf( "   load_geom_mesh: " );
00586     result = load_geom_mesh_test( geom_filename, mesh_filename, geom, mesh );
00587     handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00588     number_tests++;
00589     printf( "\n" );
00590 
00591     /* create_relation test */
00592     printf( "   create_relation: " );
00593     result = create_relation_test( assoc, geom, mesh, &pair );
00594     handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00595     number_tests++;
00596     printf( "\n" );
00597 
00598     /* relate_geom_mesh test */
00599     printf( "   relate_geom_mesh: " );
00600     result = relate_geom_mesh_test( assoc, geom, mesh, pair );
00601     handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00602     number_tests++;
00603     printf( "\n" );
00604 
00605     /* query_relations test */
00606     printf( "   query_relations: " );
00607     result = query_relations_test( assoc, geom, mesh, pair );
00608     handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00609     number_tests++;
00610     printf( "\n" );
00611 
00612     /* summary */
00613 
00614     printf( "\niRel TEST SUMMARY: \n" );
00615     printf( "   Number Tests:           %d\n", number_tests );
00616     printf( "   Number Successful:      %d\n", number_tests_successful );
00617     printf( "   Number Not Implemented: %d\n", number_tests_not_implemented );
00618     printf( "   Number Failed:          %d\n", number_tests_failed );
00619     printf( "\n\n" );
00620 
00621     iRel_destroy( assoc, &result );
00622     iMesh_dtor( mesh, &result );
00623     iGeom_dtor( geom, &result );
00624 
00625     return number_tests_failed != 0;
00626 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines