[cig-commits] r13086 - in cs/cigma/trunk: . src tests/libcigma tests/pytests

luis at geodynamics.org luis at geodynamics.org
Wed Oct 15 12:07:15 PDT 2008


Author: luis
Date: 2008-10-15 12:07:14 -0700 (Wed, 15 Oct 2008)
New Revision: 13086

Added:
   cs/cigma/trunk/src/py_FileReader.h
   cs/cigma/trunk/tests/pytests/test_reader.py
Modified:
   cs/cigma/trunk/Makefile.am
   cs/cigma/trunk/src/py_FileReader.cpp
   cs/cigma/trunk/src/py_cigma_module.cpp
   cs/cigma/trunk/src/py_cigma_setup.py
   cs/cigma/trunk/tests/libcigma/ReaderTest.cpp
   cs/cigma/trunk/tests/libcigma/ReaderTest.h
Log:
Python bindings for abstract class cigma::FileReader

Note that pyFileReader also derives from wrapper<FileReader>,
which allows us to define new readers at runtime (from Python)

Modified: cs/cigma/trunk/Makefile.am
===================================================================
--- cs/cigma/trunk/Makefile.am	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/Makefile.am	2008-10-15 19:07:14 UTC (rev 13086)
@@ -230,6 +230,7 @@
 	src/py_ElementBlock.cpp \
 	src/py_NodeCoordinates.cpp \
 	src/py_Function.cpp \
+	src/py_FileReader.cpp \
 	src/py_Misc.cpp \
 	src/py_cigma_module.cpp
 

Modified: cs/cigma/trunk/src/py_FileReader.cpp
===================================================================
--- cs/cigma/trunk/src/py_FileReader.cpp	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/src/py_FileReader.cpp	2008-10-15 19:07:14 UTC (rev 13086)
@@ -1,68 +1,113 @@
-#include "io_file_reader.h"
-#include "io_null_reader.h"
-#include "io_text_reader.h"
+#include "py_FileReader.h"
+#include "numpy_util.h"
 
-#ifdef HAVE_HDF5
-#include "io_hdf5_reader.h"
-#endif
+using namespace cigma;
+using namespace boost::python;
 
-#ifdef HAVE_VTK
-#include "io_vtk_reader.h"
-#include "io_ucd_reader.h"
-#endif
+// ----------------------------------------------------------------------------
 
-#include <boost/python.hpp>
+FileReader::ReaderType pyFileReader::getReaderType()
+{
+    return this->get_override("getReaderType")();
+}
 
-using namespace boost::python;
+int pyFileReader::open(const char *filename)
+{
+    return this->get_override("open")(filename);
+}
 
-struct pyFileReader : FileReader, wrapper<FileReader>
+int pyFileReader::close()
 {
-};
+    return this->get_override("close")();
+}
 
-class pyNullReader : NullReader
+int pyFileReader::getDataset(const char *loc, double **data, int *num, int *dim)
 {
-};
+    return 0;
+}
 
-class pyTextReader : TextReader
+int pyFileReader::getCoordinates(const char *loc, double **coordinates, int *nno, int *nsd)
 {
-};
+    return 0;
+}
 
-/* Wrap the HDF5 reader */
-#ifdef HAVE_HDF5
-class pyHDF5Reader : HDF5_Reader
+int pyFileReader::getConnectivity(const char *loc, int **connectivity, int *nel, int *ndofs)
 {
-};
-#endif
+    return 0;
+}
 
-/* Wrap the VTK reader */
-#ifdef HAVE_VTK
-class pyVTKReader : VtkReader
+// ----------------------------------------------------------------------------
+
+int pyNullReader::open(const char *filename)
 {
-};
-class pyUCDReader : UCD_Reader
+    // XXX: use std::ostringstream to put filename in error string
+    PyErr_SetString(PyExc_IOError, "Cannot open <filename> with NullReader");
+    throw_error_already_set();
+    return -1;
+}
+
+int pyNullReader::close()
 {
-};
+    PyErr_SetString(PyExc_IOError, "Cannot close a NullReader instance");
+    throw_error_already_set();
+    return -1;
+}
+
+// ----------------------------------------------------------------------------
+
+int pyTextReader::open(const char *filename)
+{
+    // anything to do? (validation-wise)
+    return TextReader::open(filename);
+}
+
+int pyTextReader::close()
+{
+    // anything to do? (validation-wise)
+    return TextReader::close();
+}
+
+// ----------------------------------------------------------------------------
+
+#ifdef HAVE_HDF5
 #endif
 
+// ----------------------------------------------------------------------------
 
+#ifdef HAVE_VTK
+#endif
+
+// ----------------------------------------------------------------------------
+
 void export_FileReader()
 {
+    using namespace cigma;
     using namespace boost::python;
 
+    enum_<FileReader::ReaderType>("FileReaderType")
+        .value("NULL_READER", FileReader::NULL_FILE_READER)
+        .value("HDF5_READER", FileReader::HDF5_FILE_READER)
+        .value("VTK_READER", FileReader::VTK_FILE_READER)
+        .value("TEXT_READER", FileReader::TEXT_FILE_READER)
+        //.export_values()
+        ;
 
-    class_<pyNullReader>("NullReader")
-        .def(init<std::string>())
+    class_<pyFileReader, boost::noncopyable>("FileReader")
+        .def("open", pure_virtual(&FileReader::open))
+        .def("close", pure_virtual(&FileReader::close))
+        .def("type", pure_virtual(&FileReader::getReaderType))
+        ;
+
+    class_<pyNullReader, boost::noncopyable>("NullReader")
         .def("open", &pyNullReader::open)
-        .def("close", &pyVtkReader::close)
+        .def("close", &pyNullReader::close)
         ;
 
-    class_<pyTextReader>("TextReader")
-        .def(init<std::string>())
+    class_<pyTextReader, boost::noncopyable>("TextReader")
         .def("open", &pyTextReader::open)
         .def("close", &pyTextReader::close)
         ;
 
-/* Class definitions for HDF5 */
 #ifdef HAVE_HDF5
     class_<pyHDF5Reader>("HDF5Reader")
         .def(init<std::string>())
@@ -71,7 +116,6 @@
         ;
 #endif
 
-/* Class definitions for VTK readers */
 #ifdef HAVE_VTK
     class_<pyVTKReader>("VTKReader")
         .def(init<std::string>())

Added: cs/cigma/trunk/src/py_FileReader.h
===================================================================
--- cs/cigma/trunk/src/py_FileReader.h	                        (rev 0)
+++ cs/cigma/trunk/src/py_FileReader.h	2008-10-15 19:07:14 UTC (rev 13086)
@@ -0,0 +1,62 @@
+#ifndef __PY_FILE_READER_H__
+#define __PY_FILE_READER_H__
+
+#include "io_file_reader.h"
+#include "io_null_reader.h"
+#include "io_text_reader.h"
+
+#ifdef HAVE_HDF5
+#include "io_hdf5_reader.h"
+#endif
+
+#ifdef HAVE_VTK
+#include "io_vtk_reader.h"
+#include "io_ucd_reader.h"
+#endif
+
+#include <boost/python.hpp>
+
+
+struct pyFileReader : cigma::FileReader, boost::python::wrapper<cigma::FileReader>
+{
+    cigma::FileReader::ReaderType getReaderType();
+
+    int open(const char *filename);
+    int close();
+
+    int getDataset(const char *loc, double **data, int *num, int *dim);
+    int getCoordinates(const char *loc, double **coordinates, int *nno, int *nsd);
+    int getConnectivity(const char *loc, int **connectivity, int *nel, int *ndofs);
+};
+
+struct pyNullReader : cigma::NullReader
+{
+    int open(const char *filename);
+    int close();
+};
+
+struct pyTextReader : cigma::TextReader
+{
+    int open(const char *filename);
+    int close();
+};
+
+/* Wrap the HDF5 reader */
+#ifdef HAVE_HDF5
+struct pyHDF5Reader : cigma::HDF5_Reader
+{
+};
+#endif
+
+/* Wrap the VTK reader */
+#ifdef HAVE_VTK
+struct pyVTKReader : cigma::VtkReader
+{
+};
+struct pyUCDReader : cigma::UCD_Reader
+{
+};
+#endif
+
+
+#endif /* __PY_FILE_READER_H__ */

Modified: cs/cigma/trunk/src/py_cigma_module.cpp
===================================================================
--- cs/cigma/trunk/src/py_cigma_module.cpp	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/src/py_cigma_module.cpp	2008-10-15 19:07:14 UTC (rev 13086)
@@ -15,6 +15,7 @@
 extern void export_ElementBlock();
 extern void export_NodeCoordinates();
 extern void export_Function();
+extern void export_FileReader();
 extern void export_Misc();
 
 using namespace boost::python;
@@ -36,6 +37,7 @@
     export_ElementBlock();
     export_NodeCoordinates();
     export_Function();
+    export_FileReader();
     export_Misc();
 }
 

Modified: cs/cigma/trunk/src/py_cigma_setup.py
===================================================================
--- cs/cigma/trunk/src/py_cigma_setup.py	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/src/py_cigma_setup.py	2008-10-15 19:07:14 UTC (rev 13086)
@@ -29,6 +29,7 @@
     'py_ElementBlock.cpp',
     'py_NodeCoordinates.cpp',
     'py_Function.cpp',
+    'py_FileReader.cpp',
     'py_Misc.cpp',
 ]
 

Modified: cs/cigma/trunk/tests/libcigma/ReaderTest.cpp
===================================================================
--- cs/cigma/trunk/tests/libcigma/ReaderTest.cpp	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/tests/libcigma/ReaderTest.cpp	2008-10-15 19:07:14 UTC (rev 13086)
@@ -1,12 +1,15 @@
 #include "ReaderTest.h"
+using namespace libcigma;
+
+#include "io_file_reader.h"
+#include "io_null_reader.h"
+#include "io_text_reader.h"
+using namespace cigma;
+
 //#include <boost/filesystem.hpp>
 //#include <iostream>
 
-using namespace libcigma;
 
-ReaderTest::ReaderTest() {}
-ReaderTest::~ReaderTest() {}
-
 void ReaderTest::test_something()
 {
     /*
@@ -16,3 +19,15 @@
     cout << endl << full_path.string() << endl;
     */
 }
+
+void ReaderTest::test_null_reader()
+{
+    NullReader reader;
+    CPPUNIT_ASSERT_EQUAL(reader.getReaderType(), FileReader::NULL_FILE_READER);
+}
+
+void ReaderTest::test_text_reader()
+{
+    TextReader reader;
+    CPPUNIT_ASSERT_EQUAL(reader.getReaderType(), FileReader::TEXT_FILE_READER);
+}

Modified: cs/cigma/trunk/tests/libcigma/ReaderTest.h
===================================================================
--- cs/cigma/trunk/tests/libcigma/ReaderTest.h	2008-10-15 18:28:01 UTC (rev 13085)
+++ cs/cigma/trunk/tests/libcigma/ReaderTest.h	2008-10-15 19:07:14 UTC (rev 13086)
@@ -11,14 +11,17 @@
     {
         CPPUNIT_TEST_SUITE(ReaderTest);
         CPPUNIT_TEST(test_something);
+        CPPUNIT_TEST(test_null_reader);
+        CPPUNIT_TEST(test_text_reader);
         CPPUNIT_TEST_SUITE_END();
 
     public:
-        ReaderTest();
-        virtual ~ReaderTest();
+        ReaderTest() {}
+        ~ReaderTest() {}
 
         void test_something();
-
+        void test_null_reader();
+        void test_text_reader();
     };
 };
 

Added: cs/cigma/trunk/tests/pytests/test_reader.py
===================================================================
--- cs/cigma/trunk/tests/pytests/test_reader.py	                        (rev 0)
+++ cs/cigma/trunk/tests/pytests/test_reader.py	2008-10-15 19:07:14 UTC (rev 13086)
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+from _cigma import FileReader, NullReader, TextReader
+
+class MyFileReader(FileReader):
+    def __init__(self):
+        FileReader.__init__(self)
+    def open(self, filename):
+        return 0
+    def close(self):
+        return 0
+
+import unittest
+class ReaderTest(unittest.TestCase):
+    def __init__(self, *args):
+        unittest.TestCase.__init__(self, *args)
+    def test_reader_custom(self):
+        reader = MyFileReader()
+    def test_reader_null(self):
+        reader = NullReader()
+    def test_reader_text(self):
+        reader = TextReader()
+
+def create_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(ReaderTest))
+    return suite
+



More information about the cig-commits mailing list