/* "matrix" H used to be declared in myClass.cpp, as a "global" array; int H[m][n]; I'm trying to phase this out (for obvious reasons), and have something known as a "Nauty graph" instead. This is basically an array of unsigned ints, where the rows of a matrix are laid out in memory, using bits. The library/package is written in C, but my code "on top" is C++. I also want to move the declaration of H into myClass.h, which makes more sense. The challenge now is to handle all the references to H[][] that exist in my code. The neatest fix, I think, and I don't know whether this is possible, would be to override the [][] operator(s) of a Nauty graph, for something like this: */ int m = 5, n = 10; // actual size of matrix (50 bits) int w = (n+WORDSIZE-1)/WORDSIZE; // w = "width" in memory (32 bits WORDSIZE on my arch) H = new unsigned int[m * w]; // init H to desired size for (int j = 0; j < m; j++) for (int i = 0; i < n; i++) if (H[j] == 0) H[j] = 1; // just an example /* Here, both test and assignment are handled with the usual array [][] operators. Right now, I've moved H into myClass.h, and changed it from "int H[N][N];" to "graph *H;" Lines such as in the example give me lots of compiler errors (of course): error: invalid types "unsigned int[int]" for array subscript I would need to override [][] with something like this, using Nauty methods; */ // a) test int test(graph *g, int n, int j, int i) { int w = (n + WORDSIZE - 1) / WORDSIZE; set *gj; gj = GRAPHROW(g, j, w); // row j of g if (ISELEMENT(gj,i)) return 1; return 0; } // b) assignment void assn(graph *g, int n, int j, int i) { int w = (n + WORDSIZE -1) / WORDSIZE; set *gj; gj = GRAPHROW(g, j, w); ADDELEMENT(gj, i); }
Is this even possible? It would save me a whole bunch of search-replace in my code. My alternative is to replace like this: H[j] = H[j]; to setValue(H, i, j, getValue(H, j, i));