/*========================================================================= Program: Visualization Toolkit Module: vtkSQLDatabase.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /*------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. -------------------------------------------------------------------------*/ #include "vtkTextCodec.h" #include namespace { // iterator to throw away input. class bucketIterator : public vtkTextCodec::OutputIterator { public: bucketIterator& operator=(const vtkTypeUInt32&) override { return *this; } }; class stringIterator : public vtkTextCodec::OutputIterator { public: stringIterator(std::string& output) : Output(output) { } stringIterator& operator=(const vtkTypeUInt32& value) override { utf8::append(value, std::back_inserter(this->Output)); return *this; } private: std::string& Output; }; } // end anonymous namespace const char* vtkTextCodec::Name() { return ""; } bool vtkTextCodec::CanHandle(const char* NameStr) { return (0 == strcmp(NameStr, Name())); } bool vtkTextCodec::IsValid(istream& InputStream) { bool returnBool = true; // get the position of the stream so we can restore it when we are done istream::pos_type StreamPos = InputStream.tellg(); try { bucketIterator bucket; this->ToUnicode(InputStream, bucket); } catch (...) { returnBool = false; } // reset the stream InputStream.clear(); InputStream.seekg(StreamPos); return returnBool; } void vtkTextCodec::ToUnicode(istream& inputStream, vtkTextCodec::OutputIterator& output) { try { while (!inputStream.eof()) { const vtkTypeUInt32 CodePoint = NextUTF32CodePoint(inputStream); *output++ = CodePoint; } } catch (...) { if (!inputStream.eof()) { throw; } } } vtkTextCodec::~vtkTextCodec() = default; vtkTextCodec::vtkTextCodec() = default; std::string vtkTextCodec::ToString(istream& inputStream) { std::string result; stringIterator iterator(result); this->ToUnicode(inputStream, iterator); return result; } void vtkTextCodec::PrintSelf(ostream& os, vtkIndent indent) { os << indent << "vtkTextCodec (" << this << ") \n"; indent = indent.GetNextIndent(); this->Superclass::PrintSelf(os, indent.GetNextIndent()); }