From ac4278970c636183f571836ffbbe9be6dab6439d Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Sun, 28 Aug 2016 13:00:44 -0400 Subject: [PATCH 1/3] Check for tabs instead of spaces in the doc build This adds a tool that checks style (currently just for tabs instead of spaces in files under include/tests/docs) and produces a travis-ci build failure if any problems are found. --- .travis.yml | 6 ++++-- tools/check-style.sh | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100755 tools/check-style.sh diff --git a/.travis.yml b/.travis.yml index 4dd3d8e2a..23e856c9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,9 +38,11 @@ matrix: # Documentation build: - os: linux language: docs - env: DOCS + env: DOCS STYLE install: pip install sphinx sphinx_rtd_theme - script: make -C docs html SPHINX_OPTIONS=-W + script: + - make -C docs html SPHINX_OPTIONS=-W + - tools/check-style.sh cache: directories: - $HOME/.cache/pip diff --git a/tools/check-style.sh b/tools/check-style.sh new file mode 100755 index 000000000..412e67b5d --- /dev/null +++ b/tools/check-style.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Script to check include/test code for common pybind11 code style errors. +# Currently just checks for tabs used instead of spaces. +# +# Invoke as: tools/check-style.sh +# + +found=0 +for f in `grep $'\t' include/ tests/ docs/*.rst -rl`; do + if [ "$found" -eq 0 ]; then + echo -e '\e[31m\e[01mError: found tabs instead of spaces in the following files:\e[0m' + found=1 + fi + + echo " $f" +done + +exit $found From 540ae61d3ca86ed7b06b2c513e30e0670769589a Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Sun, 28 Aug 2016 13:46:25 -0400 Subject: [PATCH 2/3] Replace tabs with spaces (to pass style check) --- tests/object.h | 154 ++++++++++++++++++------------------- tests/test_stl_binders.cpp | 20 ++--- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/tests/object.h b/tests/object.h index 99a6916c5..31aa28963 100644 --- a/tests/object.h +++ b/tests/object.h @@ -13,32 +13,32 @@ public: /// Copy constructor Object(const Object &) : m_refCount(0) { print_copy_created(this); } - /// Return the current reference count - int getRefCount() const { return m_refCount; }; + /// Return the current reference count + int getRefCount() const { return m_refCount; }; - /// Increase the object's reference count by one - void incRef() const { ++m_refCount; } + /// Increase the object's reference count by one + void incRef() const { ++m_refCount; } - /** \brief Decrease the reference count of - * the object and possibly deallocate it. - * - * The object will automatically be deallocated once - * the reference count reaches zero. - */ - void decRef(bool dealloc = true) const { - --m_refCount; - if (m_refCount == 0 && dealloc) + /** \brief Decrease the reference count of + * the object and possibly deallocate it. + * + * The object will automatically be deallocated once + * the reference count reaches zero. + */ + void decRef(bool dealloc = true) const { + --m_refCount; + if (m_refCount == 0 && dealloc) delete this; else if (m_refCount < 0) - throw std::runtime_error("Internal error: reference count < 0!"); + throw std::runtime_error("Internal error: reference count < 0!"); } virtual std::string toString() const = 0; protected: - /** \brief Virtual protected deconstructor. - * (Will only be called by \ref ref) - */ - virtual ~Object() { print_destroyed(this); } + /** \brief Virtual protected deconstructor. + * (Will only be called by \ref ref) + */ + virtual ~Object() { print_destroyed(this); } private: mutable std::atomic m_refCount { 0 }; }; @@ -61,18 +61,18 @@ class ref_tag {}; */ template class ref { public: - /// Create a nullptr reference + /// Create a nullptr reference ref() : m_ptr(nullptr) { print_default_created(this); track_default_created((ref_tag*) this); } /// Construct a reference from a pointer - ref(T *ptr) : m_ptr(ptr) { - if (m_ptr) ((Object *) m_ptr)->incRef(); + ref(T *ptr) : m_ptr(ptr) { + if (m_ptr) ((Object *) m_ptr)->incRef(); print_created(this, "from pointer", m_ptr); track_created((ref_tag*) this, "from pointer"); - } + } - /// Copy constructor + /// Copy constructor ref(const ref &r) : m_ptr(r.m_ptr) { if (m_ptr) ((Object *) m_ptr)->incRef(); @@ -96,80 +96,80 @@ public: } /// Move another reference into the current one - ref& operator=(ref&& r) { + ref& operator=(ref&& r) { print_move_assigned(this, "pointer", r.m_ptr); track_move_assigned((ref_tag*) this); - if (*this == r) - return *this; - if (m_ptr) - ((Object *) m_ptr)->decRef(); - m_ptr = r.m_ptr; - r.m_ptr = nullptr; - return *this; - } + if (*this == r) + return *this; + if (m_ptr) + ((Object *) m_ptr)->decRef(); + m_ptr = r.m_ptr; + r.m_ptr = nullptr; + return *this; + } - /// Overwrite this reference with another reference - ref& operator=(const ref& r) { + /// Overwrite this reference with another reference + ref& operator=(const ref& r) { print_copy_assigned(this, "pointer", r.m_ptr); track_copy_assigned((ref_tag*) this); - if (m_ptr == r.m_ptr) - return *this; - if (m_ptr) - ((Object *) m_ptr)->decRef(); - m_ptr = r.m_ptr; - if (m_ptr) - ((Object *) m_ptr)->incRef(); - return *this; - } + if (m_ptr == r.m_ptr) + return *this; + if (m_ptr) + ((Object *) m_ptr)->decRef(); + m_ptr = r.m_ptr; + if (m_ptr) + ((Object *) m_ptr)->incRef(); + return *this; + } - /// Overwrite this reference with a pointer to another object - ref& operator=(T *ptr) { + /// Overwrite this reference with a pointer to another object + ref& operator=(T *ptr) { print_values(this, "assigned pointer"); track_values((ref_tag*) this, "assigned pointer"); - if (m_ptr == ptr) - return *this; - if (m_ptr) - ((Object *) m_ptr)->decRef(); - m_ptr = ptr; - if (m_ptr) - ((Object *) m_ptr)->incRef(); - return *this; - } + if (m_ptr == ptr) + return *this; + if (m_ptr) + ((Object *) m_ptr)->decRef(); + m_ptr = ptr; + if (m_ptr) + ((Object *) m_ptr)->incRef(); + return *this; + } - /// Compare this reference with another reference - bool operator==(const ref &r) const { return m_ptr == r.m_ptr; } + /// Compare this reference with another reference + bool operator==(const ref &r) const { return m_ptr == r.m_ptr; } - /// Compare this reference with another reference - bool operator!=(const ref &r) const { return m_ptr != r.m_ptr; } + /// Compare this reference with another reference + bool operator!=(const ref &r) const { return m_ptr != r.m_ptr; } - /// Compare this reference with a pointer - bool operator==(const T* ptr) const { return m_ptr == ptr; } + /// Compare this reference with a pointer + bool operator==(const T* ptr) const { return m_ptr == ptr; } - /// Compare this reference with a pointer - bool operator!=(const T* ptr) const { return m_ptr != ptr; } + /// Compare this reference with a pointer + bool operator!=(const T* ptr) const { return m_ptr != ptr; } - /// Access the object referenced by this reference - T* operator->() { return m_ptr; } + /// Access the object referenced by this reference + T* operator->() { return m_ptr; } - /// Access the object referenced by this reference - const T* operator->() const { return m_ptr; } + /// Access the object referenced by this reference + const T* operator->() const { return m_ptr; } - /// Return a C++ reference to the referenced object - T& operator*() { return *m_ptr; } + /// Return a C++ reference to the referenced object + T& operator*() { return *m_ptr; } - /// Return a const C++ reference to the referenced object - const T& operator*() const { return *m_ptr; } + /// Return a const C++ reference to the referenced object + const T& operator*() const { return *m_ptr; } - /// Return a pointer to the referenced object - operator T* () { return m_ptr; } + /// Return a pointer to the referenced object + operator T* () { return m_ptr; } - /// Return a const pointer to the referenced object - T* get() { return m_ptr; } + /// Return a const pointer to the referenced object + T* get() { return m_ptr; } - /// Return a pointer to the referenced object - const T* get() const { return m_ptr; } + /// Return a pointer to the referenced object + const T* get() const { return m_ptr; } private: - T *m_ptr; + T *m_ptr; }; #endif /* __OBJECT_H */ diff --git a/tests/test_stl_binders.cpp b/tests/test_stl_binders.cpp index e2a44e19e..da854fc46 100644 --- a/tests/test_stl_binders.cpp +++ b/tests/test_stl_binders.cpp @@ -13,25 +13,25 @@ class El { public: - El() = delete; - El(int v) : a(v) { } + El() = delete; + El(int v) : a(v) { } - int a; + int a; }; std::ostream & operator<<(std::ostream &s, El const&v) { - s << "El{" << v.a << '}'; - return s; + s << "El{" << v.a << '}'; + return s; } void init_ex_stl_binder_vector(py::module &m) { - py::class_(m, "El") - .def(py::init()); + py::class_(m, "El") + .def(py::init()); - py::bind_vector(m, "VectorInt"); - py::bind_vector(m, "VectorBool"); + py::bind_vector(m, "VectorInt"); + py::bind_vector(m, "VectorBool"); - py::bind_vector(m, "VectorEl"); + py::bind_vector(m, "VectorEl"); py::bind_vector>(m, "VectorVectorEl"); } From dbc4bf68edb28ab3c0faa2d0b9ab709248562c7e Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Sun, 28 Aug 2016 14:53:04 -0400 Subject: [PATCH 3/3] check-style: also report no space in if(/for(/while( --- tools/check-style.sh | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/tools/check-style.sh b/tools/check-style.sh index 412e67b5d..c5ad5f74a 100755 --- a/tools/check-style.sh +++ b/tools/check-style.sh @@ -6,14 +6,28 @@ # Invoke as: tools/check-style.sh # -found=0 -for f in `grep $'\t' include/ tests/ docs/*.rst -rl`; do - if [ "$found" -eq 0 ]; then +errors=0 +IFS=$'\n' +found= +grep $'\t' include/ tests/ docs/*.rst -rl | while read f; do + if [ -z "$found" ]; then echo -e '\e[31m\e[01mError: found tabs instead of spaces in the following files:\e[0m' found=1 + errors=1 fi echo " $f" done -exit $found +found= +grep '\<\(if\|for\|while\)(' include/ tests/* -r --color=always | while read line; do + if [ -z "$found" ]; then + echo -e '\e[31m\e[01mError: found the following coding style problems:\e[0m' + found=1 + errors=1 + fi + + echo " $line" +done + +exit $errors