Files
react-native/Libraries/FBLazyVector/FBLazyVector/FBLazyVector.h
T
Andres Suarez 3b31e69e28 Tidy up license headers [2/n]
Summary: Changelog: [General] [Fixed] - License header cleanup

Reviewed By: yungsters

Differential Revision: D17952694

fbshipit-source-id: 17c87de7ebb271fa2ac8d00af72a4d1addef8bd0
2019-10-16 10:06:34 -07:00

100 lines
2.1 KiB
Objective-C

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#import <cassert>
#import <functional>
#import <iterator>
#import <FBLazyVector/FBLazyIterator.h>
namespace FB {
/**
* Presents a type-safe wrapper around an arbitrary object that represents an _immutable_ array of objects.
* Each item is constructed lazily on demand and reconstructed on each access; there is no caching.
*/
template <typename T, typename U>
class LazyVector {
public:
using value_type = T;
using reference = T;
using const_reference = T;
using const_iterator = LazyIterator<T, U>;
using iterator = const_iterator;
using size_type = std::int32_t;
using convert_type = std::function<T(U)>;
static LazyVector<T, U> fromUnsafeRawValue(U v, size_type size, convert_type convert) {
return {v, size, convert};
}
U unsafeRawValue() const {
return _v;
}
bool empty() const {
return _size == 0;
}
size_type size() const {
return _size;
}
const_reference at(size_type pos) const {
#ifndef _LIBCPP_NO_EXCEPTIONS
if (!(pos < _size)) throw std::out_of_range("out of range");
#else
assert(pos < _size || !"out of range");
#endif
return _convert(_v[pos]);
}
const_reference operator[](size_type pos) const {
assert(pos < _size);
return _convert(_v[pos]);
}
const_reference front() const {
assert(_size);
return (*this)[0];
}
const_reference back() const {
assert(_size);
return (*this)[_size - 1];
}
const_iterator begin() const {
return const_iterator(_v, _convert, 0);
}
const_iterator cbegin() const {
return begin();
}
const_iterator end() const {
return const_iterator(_v, _convert, _size);
}
const_iterator cend() const {
return end();
}
private:
/** Wrapped vector */
LazyVector(U vector, size_type size, convert_type convert)
: _v(vector), _size(size), _convert(convert) {}
U _v;
size_type _size;
convert_type _convert;
};
}