20#ifndef PLYWOOT_PARSER_VARIANT_HPP
21#define PLYWOOT_PARSER_VARIANT_HPP
32namespace plywoot::detail {
38 ParserVariant(std::istream &is, PlyFormat format) : variant_{makeVariant(is, format)} {}
40 PlyElementData read(
const PlyElement &element)
const
42 return std::visit([&](
auto &&parser) {
return parser.read(element); }, variant_);
45 template<
typename Layout>
46 void read(
const PlyElement &element, std::uint8_t *dest, std::size_t alignment)
const
48 VisitHelper<Layout>::visit(element, dest, alignment, variant_);
51 void skip(
const PlyElement &element)
const
53 std::visit([&element](
auto &&parser) { parser.skip(element); }, variant_);
57 using Variant = std::variant<
58 detail::Parser<detail::AsciiParserPolicy>,
59 detail::Parser<detail::BinaryBigEndianParserPolicy>,
60 detail::Parser<detail::BinaryLittleEndianParserPolicy>>;
63 template<
typename Layout>
66 template<
template <
typename ...>
class Layout,
typename ...Ts>
67 struct VisitHelper<Layout<Ts...>>
69 static void visit(
const PlyElement &element, std::uint8_t *dest, std::size_t alignment,
const Variant &v)
71 std::visit([&element, dest, alignment](
auto &&parser) { parser.template read<Ts...>(element, dest, alignment); }, v);
75 Variant makeVariant(std::istream &is, PlyFormat format)
79 case PlyFormat::Ascii:
80 return Variant{std::in_place_type<detail::Parser<detail::AsciiParserPolicy>>, is};
81 case PlyFormat::BinaryBigEndian:
82 return Variant{std::in_place_type<detail::Parser<detail::BinaryBigEndianParserPolicy>>, is};
83 case PlyFormat::BinaryLittleEndian:
88 return Variant{std::in_place_type<detail::Parser<detail::BinaryLittleEndianParserPolicy>>, is};