33 namespace Experimental {
 
   60    std::unique_ptr<RNTupleModel> fModel;
 
   62    NTupleSize_t fNEntries;
 
   65    explicit RNTuple(std::unique_ptr<RNTupleModel> model);
 
   68    RNTuple(
const RNTuple&) = 
delete;
 
   69    RNTuple& operator =(
const RNTuple&) = 
delete;
 
   72    RNTupleModel* GetModel() { 
return fModel.get(); }
 
   81 enum class ENTupleInfo {
 
  100 class RNTupleReader : 
public Detail::RNTuple {
 
  102    std::unique_ptr<Detail::RPageSource> fSource;
 
  103    Detail::RNTupleMetrics fMetrics;
 
  109    class RIterator : 
public std::iterator<std::forward_iterator_tag, NTupleSize_t> {
 
  111       using iterator = RIterator;
 
  112       NTupleSize_t fIndex = kInvalidNTupleIndex;
 
  114       RIterator() = 
default;
 
  115       explicit RIterator(NTupleSize_t index) : fIndex(index) {}
 
  116       ~RIterator() = 
default;
 
  118       iterator  operator++(
int)         { 
auto r = *
this; fIndex++; 
return r; }
 
  119       iterator& operator++()             { ++fIndex; 
return *
this; }
 
  120       reference operator* ()                         { 
return fIndex; }
 
  121       pointer   operator->()                         { 
return &fIndex; }
 
  122       bool      operator==(
const iterator& rh)
 const { 
return fIndex == rh.fIndex; }
 
  123       bool      operator!=(
const iterator& rh)
 const { 
return fIndex != rh.fIndex; }
 
  127    static std::unique_ptr<RNTupleReader> Open(std::unique_ptr<RNTupleModel> model,
 
  128                                              std::string_view ntupleName,
 
  129                                              std::string_view storage);
 
  130    static std::unique_ptr<RNTupleReader> Open(std::string_view ntupleName, std::string_view storage);
 
  133    RNTupleReader(std::unique_ptr<RNTupleModel> model, std::unique_ptr<Detail::RPageSource> source);
 
  135    explicit RNTupleReader(std::unique_ptr<Detail::RPageSource> source);
 
  136    std::unique_ptr<RNTupleReader> Clone() { 
return std::make_unique<RNTupleReader>(fSource->Clone()); }
 
  139    NTupleSize_t GetNEntries()
 const { 
return fNEntries; }
 
  140    const RNTupleDescriptor &GetDescriptor()
 const { 
return fSource->GetDescriptor(); }
 
  143    void PrintInfo(
const ENTupleInfo what = ENTupleInfo::kSummary, std::ostream &output = std::cout);
 
  147    void LoadEntry(NTupleSize_t index) { LoadEntry(index, fModel->GetDefaultEntry()); }
 
  149    void LoadEntry(NTupleSize_t index, REntry* entry) {
 
  150       for (
auto& value : *entry) {
 
  151          value.GetField()->Read(index, &value);
 
  155    RNTupleGlobalRange GetViewRange() { 
return RNTupleGlobalRange(0, fNEntries); }
 
  160    template <
typename T>
 
  161    RNTupleView<T> GetView(std::string_view fieldName) {
 
  162       auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName);
 
  163       return RNTupleView<T>(fieldId, fSource.get());
 
  165    RNTupleViewCollection GetViewCollection(std::string_view fieldName) {
 
  166       auto fieldId = fSource->GetDescriptor().FindFieldId(fieldName);
 
  167       return RNTupleViewCollection(fieldId, fSource.get());
 
  170    RIterator begin() { 
return RIterator(0); }
 
  171    RIterator end() { 
return RIterator(fNEntries); }
 
  173    void EnableMetrics() { fMetrics.Enable(); }
 
  188 class RNTupleWriter : 
public Detail::RNTuple {
 
  190    static constexpr NTupleSize_t kDefaultClusterSizeEntries = 64000;
 
  191    std::unique_ptr<Detail::RPageSink> fSink;
 
  192    NTupleSize_t fClusterSizeEntries;
 
  193    NTupleSize_t fLastCommitted;
 
  196    static std::unique_ptr<RNTupleWriter> Recreate(std::unique_ptr<RNTupleModel> model,
 
  197                                                   std::string_view ntupleName,
 
  198                                                   std::string_view storage,
 
  199                                                   const RNTupleWriteOptions &options = RNTupleWriteOptions());
 
  200    RNTupleWriter(std::unique_ptr<RNTupleModel> model, std::unique_ptr<Detail::RPageSink> sink);
 
  201    RNTupleWriter(
const RNTupleWriter&) = 
delete;
 
  202    RNTupleWriter& operator=(
const RNTupleWriter&) = 
delete;
 
  206    void Fill() { Fill(fModel->GetDefaultEntry()); }
 
  209    void Fill(REntry *entry) {
 
  210       for (
auto& value : *entry) {
 
  211          value.GetField()->Append(value);
 
  214       if ((fNEntries % fClusterSizeEntries) == 0)
 
  218    void CommitCluster();
 
  232 class RCollectionNTuple {
 
  234    ClusterSize_t fOffset;
 
  235    std::unique_ptr<REntry> fDefaultEntry;
 
  237    explicit RCollectionNTuple(std::unique_ptr<REntry> defaultEntry);
 
  238    RCollectionNTuple(
const RCollectionNTuple&) = 
delete;
 
  239    RCollectionNTuple& operator=(
const RCollectionNTuple&) = 
delete;
 
  240    ~RCollectionNTuple() = 
default;
 
  242    void Fill() { Fill(fDefaultEntry.get()); }
 
  243    void Fill(REntry *entry) {
 
  244       for (
auto& treeValue : *entry) {
 
  245          treeValue.GetField()->Append(treeValue);
 
  250    ClusterSize_t* GetOffsetPtr() { 
return &fOffset; }