File: custom-sequence.h

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (147 lines) | stat: -rw-r--r-- 4,142 bytes parent folder | download
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef TEST_INTEROP_CXX_STDLIB_INPUTS_CUSTOM_SEQUENCE_H
#define TEST_INTEROP_CXX_STDLIB_INPUTS_CUSTOM_SEQUENCE_H

#include "custom-iterator.h"
#include <iterator>

struct SimpleSequence {
  ConstIterator begin() const { return ConstIterator(1); }
  ConstIterator end() const { return ConstIterator(5); }
};

struct SimpleSequenceWithOutOfLineEqualEqual {
  ConstIteratorOutOfLineEq begin() const { return ConstIteratorOutOfLineEq(1); }
  ConstIteratorOutOfLineEq end() const { return ConstIteratorOutOfLineEq(5); }
};

static int copiesCount = 0;

struct SimpleCopyAwareSequence {
  ConstIterator begin() const { return ConstIterator(1); }
  ConstIterator end() const { return ConstIterator(5); }

  SimpleCopyAwareSequence() {}
  SimpleCopyAwareSequence(const SimpleCopyAwareSequence &other) { copiesCount++; }
};

struct SimpleArrayWrapper {
private:
  int a[5] = {10, 20, 30, 40, 50};

public:
  const int *begin() const __attribute__((returns_nonnull)) { return &a[0]; }
  const int *end() const __attribute__((returns_nonnull)) { return &a[5]; }
};

struct SimpleArrayWrapperNullableIterators {
private:
  int a[5] = {10, 20, 30, 40, 50};

public:
  const int *begin() const { return &a[0]; }
  const int *end() const { return &a[5]; }
};

struct SimpleEmptySequence {
  const int *begin() const { return nullptr; }
  const int *end() const { return nullptr; }
};

struct HasMutatingBeginEnd {
  ConstIterator begin() { return ConstIterator(1); }
  ConstIterator end() { return ConstIterator(5); }
};

// TODO: this should conform to CxxSequence.
struct __attribute__((swift_attr("import_reference"),
                      swift_attr("retain:immortal"),
                      swift_attr("release:immortal"))) ImmortalSequence {
  ConstIterator begin() { return ConstIterator(1); }
  ConstIterator end() { return ConstIterator(5); }
};

// MARK: Types that are not actually sequences

struct HasNoBeginMethod {
  ConstIterator end() const { return ConstIterator(1); }
};

struct HasNoEndMethod {
  ConstIterator begin() const { return ConstIterator(1); }
};

struct HasBeginEndTypeMismatch {
  ConstIterator begin() const { return ConstIterator(1); }
  ConstIteratorOutOfLineEq end() const { return ConstIteratorOutOfLineEq(3); }
};

struct HasBeginEndReturnNonIterators {
  struct NotIterator {};

  NotIterator begin() const { return NotIterator(); }
  NotIterator end() const { return NotIterator(); }
};

// TODO: this should not be conformed to CxxSequence, because
//  `const ConstIterator &` is imported as `UnsafePointer<ConstIterator>`, and
//  calling `successor()` is not actually going to call
//  `ConstIterator::operator++()`. It will increment the address instead.
struct HasBeginEndReturnRef {
private:
  ConstIterator b = ConstIterator(1);
  ConstIterator e = ConstIterator(5);

public:
  const ConstIterator &begin() const { return b; }
  const ConstIterator &end() const { return e; }
};

template <typename A> struct NoDefinition;

template <typename A, typename NoDef = NoDefinition<A>>
struct HasTemplatedIterator {
  typedef NoDef* iterator; // OpaquePointer

  iterator begin() const;
  iterator end() const;
};

typedef HasTemplatedIterator<int> HasUninstantiatableIterator;

struct HasInheritedConstIterator {
private:
  InheritedConstIterator b = InheritedConstIterator(1);
  InheritedConstIterator e = InheritedConstIterator(6);

public:
  InheritedConstIterator begin() const { return b; }
  InheritedConstIterator end() const { return e; }
};

template <typename T>
struct HasInheritedTemplatedConstIterator {
public:
  typedef InheritedTemplatedConstIterator<int> iterator;

private:
  iterator b = iterator(1);
  iterator e = iterator(7);

public:
  iterator begin() const { return b; }
  iterator end() const { return e; }
};

typedef HasInheritedTemplatedConstIterator<int>
    HasInheritedTemplatedConstIteratorInt;

struct HasInputOutputConstIterator {
  typedef InputOutputConstIterator iterator;

  mutable int x[5] = {5, 4, 3, 2, 1};

  iterator begin() const { return iterator(x); }
  iterator end() const { return iterator(x + 5); }
};

#endif // TEST_INTEROP_CXX_STDLIB_INPUTS_CUSTOM_SEQUENCE_H