On Fri, Sep 28, 2012 at 3:17 PM, Karl Rupp <span dir="ltr"><<a href="mailto:rupp@mcs.anl.gov" target="_blank">rupp@mcs.anl.gov</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<div class="im"><br>
<br>
>       The reason we use a #define instead of typedef is because of<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
(...)<div class="im"><br>
<br>
We really want to be able to const the beast in many places and I couldn't get it to work with typedefs in a way natural for users.  If you can come up with a clean natural way to handle the const we can switch.<br>
</div></blockquote>
<br>
Ok, I see. Let me be a bit persistent then and hunt for occurrences of 'VecType' without 'const':<br>
<br>
$> grep -r "VecType" *.h | grep -v "const VecType"<br>
petscvec.h:.seealso:  VecCreate(), VecType, VecSetType()<br>
petscvec.h:    VecType - String with the name of a PETSc vector or the creation function<br>
petscvec.h:#define VecType char*<br>
<br>
<br>
Alright, so<br>
 typedef const char * VecType;<br>
should work here. Let's check for MatType:<br></blockquote><div><br></div><div>Unfortunately no, this does not work, or we would have done this.</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

$>grep -r "MatType" *.h | grep -v "const MatType"<br>
petscmat.h:.seealso:  MatCreate(), MatType, MatSetType()<br>
petscmat.h:    MatType - String with the name of a PETSc matrix or the creation function<br>
petscmat.h:#define MatType char*<br>
petscmat.h:.seealso: MatGetFactor(), Mat, MatSetType(), MatType<br>
petscmat.h:    Notes: MATMFFD is a specific MatType which uses the MatMFFD data structure<br>
<br>
<br>
So<br>
 typedef const char * MatType;<br>
should also be fine here as well. Repeating the game for all PETSc-types with the following bash-beast (i.e. repeat the procedure above for every #define XYZType char*):<br>
for t in `grep -hr "Type char" *.h | sed '/^#define */!d; s///;' | sed '/ char\*/!d; s///;'` ; do   grep -r "${t}" *.h | grep -v "const ${t}"; done<br>
<br>
one finds only a single function which is not using a 'const' in front of any *Type defined via the preprocessor:<br>
PETSC_EXTERN PetscErrorCode MatColoringRegister(const char[],const char[],const char[],PetscErrorCode(*)(Mat,<u></u>MatColoringType,ISColoring *));<br>
Now, assuming that 'const' was simply forgotten here, what about typedef-ing everything to 'const char *' then? It shouldn't be too much of a painful day...<div class="im"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
2)   Having Vec but PetscVecType would be terribly inconsistent mess.   Better to switch everything in one painful day.<br>
</blockquote>
<br></div>
In the context of what Matt said initially (of which I wasn't aware and I wouldn't have expected a general PETSc-type to be defined via a preprocessor define), it is indeed inconsistent.<br>
<br>
Best regards,<br>
Karli<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener<br>