libebml_ng
ebmlElementType.h
Go to the documentation of this file.
1 
19 #ifndef EBML_NG_ELEMENTCLS_H
20 #define EBML_NG_ELEMENTCLS_H
21 
22 #include "ptrs.h"
23 #include "seekdata.h"
24 #include "parsing/string.h"
25 #include "parsing/io.h"
26 #include "exceptions.h"
27 #include "vint.h"
28 #include <utility>
29 
30 #include "typeof.h"
31 
32 namespace ebml {
107  friend class ebmlElement;
108  friend class ebmlMasterElementType;
109 
110  public:
111 
117  inline ebmlElementType(const char* ebmlID, const std::wstring& name);
118  inline ebmlElementType(const char* ebmlID, const std::wstring& name, const seekHelper_t* seekHelper);
119 
125  inline ebmlElementType(ebmlID_t ebmlID, const std::wstring& name);
126  inline ebmlElementType(ebmlID_t ebmlID, const std::wstring& name, const seekHelper_t* seekHelper);
127 
131  std::wstring name;
132 
140  inline ebml::ptr<ebmlElement> operator()() const;
141 
142  protected:
148  virtual ebmlElement* _new() const = 0;
149 
161  virtual ebmlElement* _decode_v(const parseString&) const = 0;
162  virtual ebmlElement* _decode_v(const parseFile&) const = 0;
163  virtual ebmlElement* _cdecode_v(const parseString&) const = 0;
164  virtual ebmlElement* _cdecode_v(const parseFile&) const = 0;
165 
189  inline ebmlElement* _decode_nocheck(const parseString& parsed) const;
190 
197  inline ebmlElement* _decode_nocheck(const parseFile& parsed) const;
198 
199  inline ebmlElement* _cdecode_nocheck(const parseString& parsed) const;
200  inline ebmlElement* _cdecode_nocheck(const parseFile& parsed) const;
220  inline ebmlElement* _decode(const parseString&) const;
221 
228  inline ebmlElement* _decode(const parseFile&) const;
229 
237  inline ebmlElement* _decode(const char*, size_t) const;
238 
245  inline ebmlElement* _decode(const std::string&) const;
246 
254  inline ebmlElement* _decode(ioBase&) const;
255 
264  inline ebmlElement* _decode(ioBase&, off_t&) const;
265 
274  inline ebmlElement* _decode(ioBase&, off_t, off_t&) const;
275 
276  inline ebmlElement* _cdecode(const parseString&) const;
277  inline ebmlElement* _cdecode(const parseFile&) const;
278  inline ebmlElement* _cdecode(const char*, size_t) const;
279  inline ebmlElement* _cdecode(const std::string&) const;
280  inline ebmlElement* _cdecode(ioBase&) const;
281  inline ebmlElement* _cdecode(ioBase&, off_t& offset) const;
282  inline ebmlElement* _cdecode(ioBase&, off_t offset, off_t& end) const;
283 
288  public:
307  inline ebml::ptr<ebmlElement> decode(const parseString&) const;
308 
315  inline ebml::ptr<ebmlElement> decode(const parseFile&) const;
316 
324  inline ebml::ptr<ebmlElement> decode(const char*, size_t) const;
325 
332  inline ebml::ptr<ebmlElement> decode(const std::string&) const;
333 
341  inline ebml::ptr<ebmlElement> decode(ioBase&) const;
342 
351  inline ebml::ptr<ebmlElement> decode(ioBase&, off_t&) const;
352 
361  inline ebml::ptr<ebmlElement> decode(ioBase&, off_t, off_t&) const;
362 
363  inline ebml::ptr<const ebmlElement> cdecode(const parseString&) const;
364  inline ebml::ptr<const ebmlElement> cdecode(const parseFile&) const;
365  inline ebml::ptr<const ebmlElement> cdecode(const char*, size_t) const;
366  inline ebml::ptr<const ebmlElement> cdecode(const std::string&) const;
368  inline ebml::ptr<const ebmlElement> cdecode(ioBase&, off_t& offset) const;
369  inline ebml::ptr<const ebmlElement> cdecode(ioBase&, off_t offset, off_t& end) const;
375 
376  public:
377  seekMapBase* initSeekMap() const;
378  seekData_t* makeSeekData(const parseString&) const;
381  seekData_t* makeSeekData(const parseFile&) const;
382  seekData_t* makeSeekData(const parseFile&, const ebmlMasterElement_wp&) const;
384 
385  public:
400  template<typename T=ebmlElementType>
401  inline T& as();
402 
417  template<typename T=ebmlElementType>
418  inline T& as() const;
419 
420  // Repr function
421  virtual std::wstring minirepr() const;
422  std::wstring repr() const;
423  };
424 
453  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t=ebmlElementType>
454  class ebmlTypeCRTP : public typebase_t {
455  using inst_t = ebmlinst_t;
456  protected:
457  using typebase_t::_decode;
458  ebmlElement* _new() const;
459  ebmlElement* _decode_v(const parseString&) const;
460  ebmlElement* _decode_v(const parseFile&) const;
461 
462  ebmlElement* _cdecode_v(const parseString&) const;
463  ebmlElement* _cdecode_v(const parseFile&) const;
464 
465  public:
466  template<typename... Args>
467  inline ebmlTypeCRTP(Args&&... args) : typebase_t(std::forward<Args>(args)...) {}
468 
483  template<typename... Args>
484  inline ebml::ptr<ebmlinst_t> operator()(Args&&... args) const;
485 
486  inline ebml::ptr<ebmlinst_t> decode(const parseString& parsed) const;
487  inline ebml::ptr<ebmlinst_t> decode(const parseFile& parsed) const;
488  inline ebml::ptr<ebmlinst_t> decode(const char* data, size_t size) const;
489  inline ebml::ptr<ebmlinst_t> decode(const std::string& data) const;
490  inline ebml::ptr<ebmlinst_t> decode(ioBase& file) const;
491  inline ebml::ptr<ebmlinst_t> decode(ioBase& file, off_t& offset) const;
492  inline ebml::ptr<ebmlinst_t> decode(ioBase& file, off_t offset, off_t& endoffset) const;
493 
494  inline ebml::ptr<const ebmlinst_t> cdecode(const parseString& parsed) const;
495  inline ebml::ptr<const ebmlinst_t> cdecode(const parseFile& parsed) const;
496  inline ebml::ptr<const ebmlinst_t> cdecode(const char* data, size_t size) const;
497  inline ebml::ptr<const ebmlinst_t> cdecode(const std::string& data) const;
498  inline ebml::ptr<const ebmlinst_t> cdecode(ioBase& file) const;
499  inline ebml::ptr<const ebmlinst_t> cdecode(ioBase& file, off_t& offset) const;
500  inline ebml::ptr<const ebmlinst_t> cdecode(ioBase& file, off_t offset, off_t& endoffset) const;
501  };
502 
504  return ebml::ptr<ebmlElement>(this->_new());
505  }
506 
507  inline ebmlElementType::ebmlElementType(const char* _ebmlID, const std::wstring& _name) : ebmlElementType(unpackVint(_ebmlID), _name) {}
508 
509  inline ebmlElementType::ebmlElementType(const char* _ebmlID, const std::wstring& _name, const seekHelper_t* seekHelper)
510  : ebmlElementType(unpackVint(_ebmlID), _name, seekHelper) {}
511 
512  inline ebmlElementType::ebmlElementType(ebmlID_t _ebmlID, const std::wstring& _name) : ebmlID(_ebmlID), name(_name) {}
513 
514  inline ebmlElementType::ebmlElementType(ebmlID_t _ebmlID, const std::wstring& _name, const seekHelper_t* seekHelper)
515  : ebmlID(_ebmlID), name(_name), _seekHelper(seekHelper) {}
516 
517  inline ebmlElement* ebmlElementType::_decode(const parseString& parsed) const {
518  if (parsed.ebmlID != ebmlID) {
519  throw ebmlNoMatch("EBML ID does not match.", this, 0, 0, 0);
520  }
521 
522  ebmlElement* elem;
523 
524  try {
525  elem = _decode_nocheck(parsed);
526 
527  } catch (ebmlDecodeError& e) {
528  if (e.cls == nullptr) {
529  e.cls = this;
530  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
531  }
532 
533  throw;
534  }
535 
536  return elem;
537  }
538 
540  return _decode(parsed)->sp();
541  }
542 
543  inline ebmlElement* ebmlElementType::_decode(const parseFile& parsed) const {
544  if (parsed.ebmlID != this->ebmlID) {
545  throw ebmlNoMatch("EBML ID does not match.", this, parsed.offset);
546  }
547 
548  return _decode_nocheck(parsed);
549  }
550 
552  return _decode(parsed)->sp();
553  }
554 
555  inline ebmlElement* ebmlElementType::_decode(const char* data, size_t size) const {
556  auto parsed = parseString(data, size);
557 
558  if (size > parsed.outerSize()) {
559  throw ebmlDataContinues("Data continues past expected end.", this, 0, parsed.ebmlIDWidth + parsed.sizeWidth, parsed.dataSize);
560  }
561 
562  return _decode(parsed);
563  }
564 
565  inline ebml::ptr<ebmlElement> ebmlElementType::decode(const char* data, size_t size) const {
566  return _decode(data, size)->sp();
567  }
568 
569  ebmlElement* ebmlElementType::_decode(const std::string& data) const {
570  return _decode(data.data(), data.size());
571  }
572 
574  return _decode(data)->sp();
575  }
576 
577  // ebmlElement* ebmlElementType::_decode(const ioBase_sp& file) const {
578  // if (file == nullptr) {
579  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&): nullptr detected.");
580  // }
581  //
582  // return _decode(*file);
583  // }
584 
585  // ebml::ptr<ebmlElement> ebmlElementType::decode(const ioBase_sp& file) const {
586  // return _decode(file)->sp();
587  // }
588 
590  auto parsed = parseFile(file);
591  // auto elem = this->decode(parsed);
592  auto elem = _decode(parsed);
593  file.seek(parsed.endOffset());
594  return elem;
595  }
596 
598  return _decode(file)->sp();
599  }
600 
601  // ebmlElement* ebmlElementType::_decode(const ioBase_sp& file, off_t& offset) const {
602  // if (file == nullptr) {
603  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&, off_t&): nullptr detected.");
604  // }
605  //
606  // return _decode(*file, offset);
607  // }
608 
609  // ebml::ptr<ebmlElement> ebmlElementType::decode(const ioBase_sp& file, off_t& offset) const {
610  // return _decode(file, offset)->sp();
611  // }
612 
613  ebmlElement* ebmlElementType::_decode(ioBase& file, off_t& offset) const {
614  auto parsed = parseFile(file, offset);
615  auto elem = _decode(parsed);
616  offset = parsed.endOffset();
617  return elem;
618  }
619 
621  return _decode(file, offset)->sp();
622  }
623 
624  // ebmlElement* ebmlElementType::_decode(const ioBase_sp& file, off_t offset, off_t& endOffset) const {
625  // if (file == nullptr) {
626  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&, off_t&): nullptr detected.");
627  // }
628  //
629  // return _decode(*file, offset, endOffset);
630  // }
631 
632  // ebml::ptr<ebmlElement> ebmlElementType::decode(const ioBase_sp& file, off_t offset, off_t& endOffset) const {
633  // return _decode(file, offset, endOffset)->sp();
634  // }
635 
636  ebmlElement* ebmlElementType::_decode(ioBase& file, off_t offset, off_t& endOffset) const {
637  auto parsed = parseFile(file, offset);
638  auto elem = _decode(parsed);
639  endOffset = parsed.endOffset();
640  return elem;
641  }
642 
643  ebml::ptr<ebmlElement> ebmlElementType::decode(ioBase& file, off_t offset, off_t& endOffset) const {
644  return _decode(file, offset, endOffset)->sp();
645  }
646 
647  // CONST DECODING
648 
650  if (parsed.ebmlID != ebmlID) {
651  throw ebmlNoMatch("EBML ID does not match.", this, 0, 0, 0);
652  }
653 
654  ebmlElement* elem;
655 
656  try {
657  elem = _cdecode_nocheck(parsed);
658 
659  } catch (ebmlDecodeError& e) {
660  if (e.cls == nullptr) {
661  e.cls = this;
662  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
663  }
664 
665  throw;
666  }
667 
668  return elem;
669  }
670 
671 
673  const auto elem = _cdecode(parsed);
674  return elem->sp();
675  }
676 
678  if (parsed.ebmlID != this->ebmlID) {
679  throw ebmlNoMatch("EBML ID does not match.", this, parsed.offset);
680  }
681 
682  return _cdecode_nocheck(parsed);
683  }
684 
686  const auto elem = _cdecode(parsed);
687  return elem->sp();
688  }
689 
690  ebmlElement* ebmlElementType::_cdecode(const char* data, size_t size) const {
691  auto parsed = parseString(data, size);
692 
693  if (size > parsed.outerSize()) {
694  throw ebmlDataContinues("Data continues past expected end.", this, 0, parsed.ebmlIDWidth + parsed.sizeWidth, parsed.dataSize);
695  }
696 
697  return _cdecode(parsed);
698  }
699 
701  const auto elem = _cdecode(data, size);
702  return elem->sp();
703  }
704 
705  ebmlElement* ebmlElementType::_cdecode(const std::string& data) const {
706  return _cdecode(data.data(), data.size());
707  }
708 
710  const auto elem = _cdecode(data);
711  return elem->sp();
712  }
713 
714  // ebmlElement* ebmlElementType::_cdecode(const ioBase_sp& file) const {
715  // if (file == nullptr) {
716  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&): nullptr detected.");
717  // }
718  //
719  // return _cdecode(*file);
720  // }
721 
722  // ebml::ptr<const ebmlElement> ebmlElementType::cdecode(const ioBase_sp& file) const {
723  // const auto elem = _cdecode(file);
724  // return elem->sp();eb
725  // }
726 
728  auto parsed = parseFile(file);
729  // auto elem = this->decode(parsed);
730  auto elem = _cdecode(parsed);
731  file.seek(parsed.endOffset());
732  return elem;
733  }
734 
736  const auto elem = _cdecode(file);
737  return elem->sp();
738  }
739 
740  // ebmlElement* ebmlElementType::_cdecode(const ioBase_sp& file, off_t& offset) const {
741  // if (file == nullptr) {
742  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&, off_t&): nullptr detected.");
743  // }
744  //
745  // return _cdecode(*file, offset);
746  // }
747 
748  // ebml::ptr<const ebmlElement> ebmlElementType::cdecode(const ioBase_sp& file, off_t& offset) const {
749  // const auto elem = _cdecode(file, offset);
750  // return elem->sp();
751  // }
752 
753  ebmlElement* ebmlElementType::_cdecode(ioBase& file, off_t& offset) const {
754  auto parsed = parseFile(file, offset);
755  auto elem = _cdecode(parsed);
756  offset = parsed.endOffset();
757  return elem;
758  }
759 
761  const auto elem = _cdecode(file, offset);
762  return elem->sp();
763  }
764 
765  // ebmlElement* ebmlElementType::_cdecode(const ioBase_sp& file, off_t offset, off_t& endOffset) const {
766  // if (file == nullptr) {eb
767  // throw std::runtime_error("ebmlElementType::decode(const ioBase_sp&, off_t&): nullptr detected.");
768  // }
769  //
770  // return _cdecode(*file, offset, endOffset);
771  // }
772 
773  // ebml::ptr<const ebmlElement> ebmlElementType::cdecode(const ioBase_sp& file, off_t offset, off_t& endOffset) const {
774  // const auto elem = _cdecode(file, offset, endOffset);
775  // return elem->sp();
776  // }
777 
778  ebmlElement* ebmlElementType::_cdecode(ioBase& file, off_t offset, off_t& endOffset) const {
779  auto parsed = parseFile(file, offset);
780  auto elem = _cdecode(parsed);
781  endOffset = parsed.endOffset();
782  return elem;
783  }
784 
785  ebml::ptr<const ebmlElement> ebmlElementType::cdecode(ioBase& file, off_t offset, off_t& endOffset) const {
786  const auto elem = _cdecode(file, offset, endOffset);
787  return elem->sp();
788  }
789 
790  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
792  return static_cast<ebmlinst_t*>(this->_decode(data, size))->sp();
793  }
794 
795  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
797  return static_cast<ebmlinst_t*>(this->_decode(data))->sp();
798  }
799 
801  try {
802  return _decode_v(parsed);
803 
804  } catch (ebmlDecodeError& e) {
805  if (e.cls == nullptr) {
806  e.cls = this;
807  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
808  }
809 
810  throw;
811  }
812  }
813 
815  ebmlElement* elem;
816 
817  try {
818  elem = _decode_v(parsed);
819 
820  } catch (ebmlDecodeError& e) {
821  if (e.cls == nullptr) {
822  e.cls = this;
823  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
824  }
825 
826  throw;
827  }
828 
829  elem->_offsetInParent = parsed.offset - parsed.parentOffset;
830  return elem;
831  }
832 
834  try {
835  return _cdecode_v(parsed);
836 
837  } catch (ebmlDecodeError& e) {
838  if (e.cls == nullptr) {
839  e.cls = this;
840  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
841  }
842 
843  throw;
844  }
845  }
846 
848  ebmlElement* elem;
849 
850  try {
851  elem = _cdecode_v(parsed);
852 
853  } catch (ebmlDecodeError& e) {
854  if (e.cls == nullptr) {
855  e.cls = this;
856  e.headSize = parsed.ebmlIDWidth + parsed.sizeWidth;
857  }
858 
859  throw;
860  }
861 
862  elem->_offsetInParent = parsed.offset - parsed.parentOffset;
863  return elem;
864  }
865 
866  template<typename T>
867  inline T& ebmlElementType::as() {
868  if (auto recast = dynamic_cast<T*>(this)) {
869  return *recast;
870  }
871 
872  throw std::bad_cast();
873  }
874 
875  template<typename T>
876  inline T& ebmlElementType::as() const {
877  if (auto recast = dynamic_cast<T*>(this)) {
878  return *recast;
879  }
880 
881  throw std::bad_cast();
882  }
883 
884  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
885  // template<typename... Args>
886  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::operator()(const Args&... args) const {
887  // auto elem = new ebmlinst_t(static_cast<const ebmltype_t*>(this), args...);
888  // elem->_validate();
889  // return elem->sp();
890  // }
891 
892  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
893  template<typename... Args>
895  auto elem = new ebmlinst_t(static_cast<const ebmltype_t*>(this), std::forward<Args>(args)...);
896  elem->_validate();
897  return elem->sp();
898  }
899 
900  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
901  // template<typename... Args>
902  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::operator()(Args... args) const {
903  // auto elem = new ebmlinst_t(static_cast<const ebmltype_t*>(this), args...);
904  // elem->_validate();
905  // return elem->sp();
906  // }
907 
908  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
909  // template<typename... Args1, typename... Args2>
910  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::operator()(const Args1&... args1, Args2... args2) const {
911  // auto elem = new ebmlinst_t(static_cast<const ebmltype_t*>(this), args1..., args2...);
912  // elem->_validate();
913  // return elem->sp();
914  // }
915 
916  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
918  return static_cast<ebmlinst_t*>(this->_decode(parsed))->sp();
919  }
920 
921  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
923  return static_cast<ebmlinst_t*>(this->_decode(parsed))->sp();
924  }
925 
926  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
927  // ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(const char* data, size_t size) const {
928  // return static_cast<ebmlinst_t*>(this->_decode(data, size))->sp();
929  // }
930 
931  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
932  // ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(const std::string& data) const {
933  // return static_cast<ebmlinst_t*>(this->_decode(data))->sp();
934  // }
935 
936  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
937  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(const ioBase_sp& file) const {
938  // return static_cast<ebmlinst_t*>(this->_decode(file))->sp();eb
939  // }
940 
941  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
943  return static_cast<ebmlinst_t*>(this->_decode(file))->sp();
944  }
945 
946  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
947  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(const ioBase_sp& file, off_t& offset) const {
948  // return static_cast<ebmlinst_t*>(this->_decode(file, offset))->sp();
949  // }
950 
951  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
953  return static_cast<ebmlinst_t*>(this->_decode(file, offset))->sp();
954  }
955 
956  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
957  // inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(const ioBase_sp& file, off_t offset, off_t& endoffset) const {
958  // return static_cast<ebmlinst_t*>(this->_decode(file, offset, endoffset))->sp();
959  // }
960 
961  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
962  inline ebml::ptr<ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::decode(ioBase& file, off_t offset, off_t& endoffset) const {
963  return static_cast<ebmlinst_t*>(this->_decode(file, offset, endoffset))->sp();
964  }
965 
966 
967 
968  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
970  return static_cast<const ebmlinst_t*>(this->_cdecode(parsed))->sp();
971  }
972 
973  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
975  return static_cast<const ebmlinst_t*>(this->_cdecode(parsed))->sp();
976  }
977 
978  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
980  return static_cast<const ebmlinst_t*>(this->_cdecode(data, size))->sp();
981  }
982 
983  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
985  return static_cast<const ebmlinst_t*>(this->_cdecode(data))->sp();
986  }
987 
988  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
989  // inline ebml::ptr<const ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::cdecode(const ioBase_sp& file) const {
990  // return static_cast<const ebmlinst_t*>(this->_cdecode(file))->sp();
991  // }
992 
993  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
995  return static_cast<const ebmlinst_t*>(this->_cdecode(file))->sp();
996  }
997 
998  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
999  // inline ebml::ptr<const ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::cdecode(const ioBase_sp& file, off_t& offset) const {
1000  // return static_cast<const ebmlinst_t*>(this->_cdecode(file, offset))->sp();
1001  // }
1002 
1003  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
1005  return static_cast<const ebmlinst_t*>(this->_cdecode(file, offset))->sp();
1006  }
1007 
1008  // template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
1009  // inline ebml::ptr<const ebmlinst_t> ebmlTypeCRTP<ebmltype_t, ebmlinst_t, typebase_t>::cdecode(const ioBase_sp& file, off_t offset, off_t& endoffset) const {
1010  // return static_cast<const ebmlinst_t*>(this->_cdecode(file, offset, endoffset))->sp();
1011  // }
1012 
1013  template<typename ebmltype_t, typename ebmlinst_t, typename typebase_t>
1015  return static_cast<const ebmlinst_t*>(this->_cdecode(file, offset, endoffset))->sp();
1016  }
1017 }
1018 
1019 #endif
Helper class for creating and initializing seek data.
Definition: seekdata.h:195
T & data(const ebmlElement_sp &elem)
const ebmlElementType * cls
Definition: exceptions.h:52
unsigned char headSize
Definition: exceptions.h:50
Abstract base class for EBML Element Type objects.
Definition: ebmlElementType.h:106
virtual ebmlElement * _new() const =0
Create a default instance of an EBML element.
size_t size(const std::string &value)
Definition: binary.h:8
ebmlElement * _decode_nocheck(const parseString &parsed) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:800
ebmlElement * _cdecode_v(const parseString &) const
ebml::ptr< const ebmlinst_t > cdecode(const parseString &parsed) const
Definition: ebmlElementType.h:969
Definition: exceptions.h:61
ebmlElement * _decode_v(const parseString &) const
Represents a parsed EBML string segment.
Definition: string.h:37
off_t offset
Definition: io.h:43
virtual ebmlElement * _cdecode_v(const parseString &) const =0
Represents parsed seek data extracted from an EBML element.
Definition: seekdata.h:39
seekHelper_t seekHelper
Definition: seekdata.cpp:136
seekData_t * makeSeekData(const parseString &) const
Definition: ebmlElementType.cpp:317
Definition: exceptions.h:90
Represents a parsed EBML file segment.
Definition: io.h:32
ebml::ptr< ebmlinst_t > operator()(Args &&... args) const
Creates a new instance of an EBML element.
Definition: ebmlElementType.h:894
ebmlElement * _decode(const parseString &) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:517
ebmlID_t ebmlID
EBML ID associated with this element type.
Definition: ebmlElementType.h:129
vintWidth_t ebmlIDWidth
Definition: string.h:40
off_t parentOffset
Definition: io.h:44
ebmlID_t ebmlID
Definition: io.h:39
vintWidth_t sizeWidth
Definition: string.h:42
A drop-in replacement for std::weak_ptr tailored for EBML objects.
Definition: ptrs.h:30
Definition: basictypes.h:40
ebmlElement * _cdecode(const parseString &) const
Definition: ebmlElementType.h:649
A drop-in replacement for std::shared_ptr tailored for EBML objects.
Definition: ptrs.h:27
virtual std::wstring minirepr() const
Definition: ebmlElementType.cpp:370
ebmlID_t ebmlID
Definition: string.h:39
ebml::ptr< ebmlinst_t > decode(const parseString &parsed) const
Definition: ebmlElementType.h:917
unsigned char sizeWidth
Definition: io.h:42
unsigned char ebmlIDWidth
Definition: io.h:40
T & as()
Definition: ebmlElementType.h:867
ebmlElement * _new() const
unsigned long long unpackVint(const char *data, size_t dataSize, unsigned char &vintw)
Decodes a vint from a byte array of known size.
Definition: vint.cpp:20
uint64_t ebmlID_t
Definition: ebmlID_t.h:7
const seekHelper_t * _seekHelper
Definition: ebmlElementType.h:374
virtual ebmlElement * _decode_v(const parseString &) const =0
off_t _offsetInParent
Definition: ebmlElement.h:242
std::wstring repr() const
Definition: ebmlElementType.cpp:349
Represents the base type for all EBML master elements.
Definition: ebmlMasterElementType.h:57
Abstract base class for EBML Element instances.
Definition: ebmlElement.h:79
ebmlElementType(const char *ebmlID, const std::wstring &name)
Constructor taking an EBML ID as a VINT string and an element name.
Definition: ebmlElementType.h:507
ebml::ptr< const ebmlElement > cdecode(const parseString &) const
Definition: ebmlElementType.h:672
ebml::ptr< ebmlElement > operator()() const
Factory operator to create a default EBML element instance.
Definition: ebmlElementType.h:503
Base class for seek map containers.
Definition: seekdata.h:126
std::wstring name
Name (as a wide string) of the element type.
Definition: ebmlElementType.h:131
ebmlTypeCRTP(Args &&... args)
Definition: ebmlElementType.h:467
Base class for file-like IO operations.
Definition: io.h:22
Definition: exceptions.h:46
seekMapBase * initSeekMap() const
Definition: ebmlElementType.cpp:313
ebml::ptr< ebmlElement > sp()
Returns a shared pointer to the element instance.
Definition: ebmlElement.cpp:348
ebmlElement * _cdecode_nocheck(const parseString &parsed) const
Definition: ebmlElementType.h:833
CRTP template for EBML Element Type objects.
Definition: ebmlElementType.h:454
off_t seek(off_t, int whence=SEEK_SET)
Definition: io.cpp:9
ebml::ptr< ebmlElement > decode(const parseString &) const
Decode element from ebml::parseString instance.
Definition: ebmlElementType.h:539