⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generic_writer.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997  Utrecht University (The Netherlands),// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),// and Tel-Aviv University (Israel).  All rights reserved.//// This file is part of CGAL (www.cgal.org); 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; version 2.1 of the License.// See the file LICENSE.LGPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Stream_support/include/CGAL/IO/Generic_writer.h $// $Id: Generic_writer.h 35787 2007-01-24 17:16:05Z spion $// //// Author(s)     : Lutz Kettner  <kettner@mpi-sb.mpg.de>#ifndef CGAL_IO_GENERIC_WRITER_H#define CGAL_IO_GENERIC_WRITER_H 1#include <CGAL/basic.h>#include <iterator>CGAL_BEGIN_NAMESPACEtemplate <class Writer>class I_Generic_writer_vertex_proxy {    Writer&  m_writer;public:    typedef typename Writer::Point Point;    I_Generic_writer_vertex_proxy( Writer& w) : m_writer(w) {}    void operator= ( const Point& p) { m_writer.write_vertex(p); }};template <class Writer>class I_Generic_writer_vertex_iterator{    Writer&  m_writer;public:    typedef std::output_iterator_tag  iterator_category;    typedef typename Writer::Point    value_type;    typedef std::ptrdiff_t            difference_type;    typedef value_type*               pointer;    typedef value_type&               reference;    typedef I_Generic_writer_vertex_proxy< Writer>    Proxy;    typedef I_Generic_writer_vertex_iterator< Writer> Self;    I_Generic_writer_vertex_iterator( Writer& w) : m_writer(w) {}    Self& operator++()      { return *this; }    Self& operator++(int)   { return *this; }    Proxy operator*() const { return Proxy( m_writer); }};template <class Writer>class I_Generic_writer_facet_proxy {    Writer&  m_writer;public:    I_Generic_writer_facet_proxy( Writer& w) : m_writer(w) {}    void operator= ( std::size_t i) { m_writer.write_facet_index(i); }};template <class Writer>class I_Generic_writer_facet_iterator{    Writer& m_writer;public:    typedef std::output_iterator_tag  iterator_category;    typedef std::size_t               value_type;    typedef std::ptrdiff_t            difference_type;    typedef value_type*               pointer;    typedef value_type&               reference;    typedef  I_Generic_writer_facet_proxy<Writer>    Proxy;    typedef  I_Generic_writer_facet_iterator<Writer> Self;    I_Generic_writer_facet_iterator( Writer& w) : m_writer(w) {}    Self& operator++()      { return *this; }    Self& operator++(int)   { return *this; }    Proxy operator*() const { return Proxy( m_writer); }};// The Generic_writer class contains also the state necessary for all// its iterators. Since these iterators are of the category// output_iterator, they could not be used more than once and their// positional state can be kept in Generic_writer, which simplifies// the situation where the iterators are copied by value.template < class Writer, class Pt >class Generic_writer {    Writer       m_writer;    std::size_t  m_vertices;    std::size_t  m_halfedges;    std::size_t  m_facets;    std::size_t  m_vcnt;    std::size_t  m_fcnt;    std::size_t  m_icnt;public:    typedef Pt                                      Point;    typedef Generic_writer< Writer, Pt>             Self;    typedef I_Generic_writer_vertex_iterator<Self>  Vertex_iterator;    typedef I_Generic_writer_facet_iterator<Self>   Facet_iterator;    Generic_writer( const Writer& writer, std::ostream& out,                    std::size_t v, std::size_t h, std::size_t f)        : m_writer( writer), m_vertices(v), m_halfedges(h), m_facets(f),          m_vcnt(0), m_fcnt(0), m_icnt(0)    {        m_writer.write_header( out, v, h, f);    }    const Writer& writer()            const  { return m_writer;    }    std::size_t   size_of_vertices()  const  { return m_vertices;  }    std::size_t   size_of_halfedges() const  { return m_halfedges; }    std::size_t   size_of_facets()    const  { return m_facets;    }    Vertex_iterator  vertices_begin() { return Vertex_iterator( *this); }    Facet_iterator   facets_begin() {        if ( m_vcnt != m_vertices) {            std::cerr << "error: Generic_writer: wrong number of "                         "vertices written, " << m_vcnt << " instead of "                      << m_vertices << "." << std::endl;            m_writer.out().clear( std::ios::badbit);        }        m_writer.write_facet_header();        if ( m_facets == 0)            m_writer.write_footer();        return Facet_iterator( *this);    }    // Interface used by the iterators and their proxies.    void write_vertex( const Point& p) {        ++m_vcnt;        m_writer.write_vertex( ::CGAL::to_double( p.x()),                               ::CGAL::to_double( p.y()),                               ::CGAL::to_double( p.z()));    }    void write_facet_index( std::size_t i) {        if ( m_fcnt > m_facets) {            std::cerr << "error: Generic_writer: too many facets written."                      << std::endl;            m_writer.out().clear( std::ios::badbit);        }        if ( m_icnt == 0) {            m_writer.write_facet_begin( i);            m_icnt = i;        } else {            m_writer.write_facet_vertex_index( i);            m_icnt --;            if ( m_icnt == 0) {                m_writer.write_facet_end();                m_fcnt ++;                if (m_fcnt == m_facets)                    m_writer.write_footer();            }        }    }};CGAL_END_NAMESPACE#endif // CGAL_IO_GENERIC_WRITER_H //// EOF //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -