1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
//===--- TupleMetadataVisitor.h - CRTP for tuple metadata ------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// A CRTP class useful for laying out tuple metadata.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_TUPLEMETADATALAYOUT_H
#define SWIFT_IRGEN_TUPLEMETADATALAYOUT_H
//#include "NominalMetadataVisitor.h"
namespace swift {
namespace irgen {
/// A CRTP class for laying out tuple metadata.
///
/// This produces an object corresponding to a TupleTypeMetadata type.
/// It does not itself doing anything special for metadata templates.
template <class Impl> struct TupleMetadataVisitor
: public MetadataVisitor<Impl> {
using super = MetadataVisitor<Impl>;
protected:
using super::asImpl;
TupleType *const Target;
TupleMetadataVisitor(IRGenModule &IGM, TupleType *const target)
: super(IGM), Target(target) {}
public:
void layout() {
super::layout();
asImpl().addNumElementsInfo();
asImpl().addLabelsInfo();
for (unsigned i = 0, n = Target->getNumElements(); i < n; ++i) {
asImpl().addElement(i, Target->getElement(i));
}
}
};
/// An "implementation" of TupleMetadataVisitor that just scans through
/// the metadata layout, maintaining the offset of all tuple elements.
template <class Impl> class TupleMetadataScanner
: public TupleMetadataVisitor<Impl> {
using super = TupleMetadataVisitor<Impl>;
protected:
Size NextOffset = Size(0);
TupleMetadataScanner(IRGenModule &IGM, TupleType *const target)
: super(IGM, target) {}
public:
void addValueWitnessTable() { addPointer(); }
void addMetadataFlags() { addPointer(); }
void addNumElementsInfo() { addPointer(); }
void addLabelsInfo() { addPointer(); }
void addElement(unsigned idx,
const TupleTypeElt &e) { addPointer(); addPointer(); }
private:
void addPointer() { NextOffset += super::IGM.getPointerSize(); }
};
} // end namespace irgen
} // end namespace swift
#endif
|