diff options
author | Tavian Barnes <tavianator@gmail.com> | 2009-06-20 16:44:19 +0000 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2009-06-20 16:44:19 +0000 |
commit | c4b1e00954c6934b081cbf3b26c55222b351cc46 (patch) | |
tree | bef427e3e5ccb67813ba78b136e1072bc8330301 /libdimensionxx/object.cpp | |
parent | 9d46468507031d2435f5b93d57c3d89cd25d0c97 (diff) | |
download | dimension-c4b1e00954c6934b081cbf3b26c55222b351cc46.tar.xz |
New C++ dmnsn_array* and dmnsn_object* wrappers.
Diffstat (limited to 'libdimensionxx/object.cpp')
-rw-r--r-- | libdimensionxx/object.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/libdimensionxx/object.cpp b/libdimensionxx/object.cpp new file mode 100644 index 0000000..33aeb85 --- /dev/null +++ b/libdimensionxx/object.cpp @@ -0,0 +1,92 @@ +/************************************************************************* + * Copyright (C) 2008 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +#include "dimensionxx.hpp" + +namespace Dimension +{ + // Pure virtual no-op destructor + Object::~Object() + { } + + // Intersection list for the line l + Array<double> + Object::intersections(const Line& l) + { + return Array<double>(m_object->intersections_fn(m_object, l.dmnsn())); + } + + // Whether the point `point' is inside the object + bool + Object::inside(const Vector& point) + { + return m_object->inside_fn(m_object, point.dmnsn()); + } + + // Return the wrapped object + dmnsn_object* + Object::dmnsn() + { + return m_object; + } + + // Return a const version of the wrapped canvas + const dmnsn_object* + Object::dmnsn() const + { + return m_object; + } + + // Protected default no-op constructor + Object::Object() + { } + + // Custom object callbacks + namespace { + dmnsn_array * + intersections_fn(const dmnsn_object *object, dmnsn_line line) + { + Custom_Object* cobject = reinterpret_cast<Custom_Object*>(object->ptr); + return cobject->intersections(Line(line)).release(); + } + + int + inside_fn(const dmnsn_object *object, dmnsn_vector point) + { + Custom_Object* cobject = reinterpret_cast<Custom_Object*>(object->ptr); + return cobject->inside(Vector(point)); + } + } + + // Initialize a new object, using member functions as callbacks + Custom_Object::Custom_Object() + : Object(dmnsn_new_object()) + { + m_object->ptr = this; + m_object->intersections_fn = &intersections_fn; + m_object->inside_fn = &inside_fn; + } + + // Delete the object + Custom_Object::~Custom_Object() + { + dmnsn_delete_object(m_object); + } +} |