From c4b1e00954c6934b081cbf3b26c55222b351cc46 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 20 Jun 2009 16:44:19 +0000 Subject: New C++ dmnsn_array* and dmnsn_object* wrappers. --- libdimensionxx/object.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 libdimensionxx/object.cpp (limited to 'libdimensionxx/object.cpp') 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 * + * * + * 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 * + * . * + *************************************************************************/ + +#include "dimensionxx.hpp" + +namespace Dimension +{ + // Pure virtual no-op destructor + Object::~Object() + { } + + // Intersection list for the line l + Array + Object::intersections(const Line& l) + { + return Array(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(object->ptr); + return cobject->intersections(Line(line)).release(); + } + + int + inside_fn(const dmnsn_object *object, dmnsn_vector point) + { + Custom_Object* cobject = reinterpret_cast(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); + } +} -- cgit v1.2.3