Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost.Hana: Iterable

Boost , ,

Boost.Hana  1.0.1
Your standard library for metaprogramming
Концепция<Iterable>представляет собой структуры данных, поддерживающие внешнюю итерацию.

Интуитивно<Iterable>можно рассматривать как своего рода контейнер, элементы которого можно вытаскивать по одному за раз.<Iterable>также дает способ узнать, когдаконтейнерпуст, т.е. когда больше нет элементов для извлечения.

В то время как<Foldable>представляет собой структуры данных, поддерживающие внутреннюю итерацию с возможностью накопления результата, концепция<Iterable>позволяет инвертировать управление итерацией. Это более гибко, чем<Foldable>, так как позволяет повторять только часть конструкции. Это, в свою очередь, позволяет<Iterable>работать над бесконечными структурами, при этом попытка сложить такую структуру никогда бы не закончилась.

Minimal complete definition

<at>,<drop_front>и<is_empty>

The linearization of an Iterable

Интуитивно для<Iterable>структуры<xs>линеаризация<xs>представляет собой последовательность всех элементов в<xs>, как если бы они были помещены в (возможно, бесконечный) список:

linearization(xs) = [x1, x2, x3, ...]

К<n>элементу линеаризации<Iterable>можно получить доступ с функцией<at>. Иными словами,<at(xs, n) == xn>.

Обратите внимание, что это понятие является именно расширениемлинеаризациипонятия<Foldable>s до бесконечного случая. Это понятие полезно для выражения различных свойств<Iterable>с и используется для этого в других документах.

Compile-time Iterables

время компиляции<Iterable>— это<Iterable>, для которого<is_empty>возвращает время компиляции<Logical>. Эти структуры позволяют выполнять итерацию во время компиляции в том смысле, что «петля», выполняющая итерацию, может быть развернута, потому что общая длина структуры выкошена во время компиляции.

В частности, обратите внимание, что время компиляции<Iterable>не имеет ничего общего с конечным или бесконечным. Например, можно было бы создать последовательность, представляющую пифагорейские тройки как<integral_constant>с. Такая последовательность была бы бесконечной, но итерация на последовательности все равно была бы выполнена во время компиляции. Однако, если бы кто-то попытался повторитьвсеэлементы последовательности, компилятор зацикливался бы на неопределенный срок, в отличие от вашей программы, зацикливающейся на неопределенный срок, если бы последовательность была зацикленной.

В текущей версии библиотеки поддерживается только время компиляции<Iterable>с.Хотя теоретически было бы возможно поддерживать время выполнения<Iterable>, его эффективное выполнение является предметом некоторых исследований. В частности, следуйтеэтому вопросудля текущего состояния времени выполнения<Iterable>с.

Laws

Во-первых, мы требуем, чтобы равенство двух<Iterable>s было связано с равенством элементов в их линеаризации. Если<xs>и<ys>— два<Iterable>типа данных<It>, то

xs == ys => at(xs, i) == at(ys, i) for all i

Это означает, что два<Iterable>должны иметь одинаковую линеаризацию, чтобы считаться равными.

Во-вторых, поскольку каждый<Iterable>также является<Searchable>, мы требуем, чтобы модели<Iterable>и<Searchable>были последовательными. Это уточняется следующими законами. Для любого<Iterable><xs>с линеаризацией<[x1, x2, x3, ...]>,

any_of(xs, equal.to(z)) <=> xi == z

,,<i>,<i>. Кроме того,

find_if(xs, pred) == just(the first xi such that pred(xi) is satisfied)

или<nothing>, если такой<xi>не существует.

Refined concepts

  1. Searchable(бесплатная модель)
    ЛюбойIterableдаёт начало моделиSearchable, где ключи и значения являются элементами в структуре. Поиск ключа — это просто линейный поиск по элементам структуры.
    // Авторское право Louis Dionne 2013-2016
    // Распространяется под лицензией Boost Software License, версия 1.0.
    // (См. сопроводительный файл LICENSE.md или копию на http://boost.org/LICENSE_1_0.txt)
    #include
    пространство именхана =повышение::хана;
    // Сначала получите тип объекта, а затем назовите на нем черту.
    constexprautois_integral =hana::compose(hana::trait, hana::typeid_);
    Constexpris_class =hana::compose(hana::trait, hana::typeid_);
    статичный_ассерт
    hana::find_if(hana::make_tuple(1.0, 2,'3'), является_интегральным)
    ==
    hana::just(2)
    ,"";;
    hana::find_if(hana::make_tuple(1.0, 2,& #39;3 & #39;), is_class)
    ==
    хана: ничего
    ;
    hana::find(hana::make_tuple(hana::int_c<1>, hana::char_c<'c'>, hana::type_c), hana::type_c
    ==
    hana::just (hana::type_c)
    ;
    hana::find(hana::make_tuple(hana::int_c<1>, hana::char_c<'c'>, hana::type_c), hana::type_c
    ==
    хана: ничего
    ;
    intmain()
    [ORIG_END] -->
  2. Foldableдля конечногоIterables
    Всякое конечноеIterableпорождает модельFoldable. Чтобы эти модели были последовательными, мы требуем, чтобы моделиFoldableиIterableимели одинаковую линеаризацию.
Note
As explained above, Iterables are also Searchables and their models have to be consistent. By the laws presented here, it also means that the Foldable model for finite Iterables has to be consistent with the Searchable model.

Для удобства конечные<Iterable>s должны давать только определение<length>для моделирования концепции<Foldable>; определение более мощных<unpack>или<fold_left>не требуется (но все же возможно). Реализация по умолчанию<unpack>, полученная из<Iterable>+<length>, использует тот факт, что<at(xs, i)>обозначает<i>элемент линейности<xs>, и что линейность конечного<Iterable>должна быть такой же, как и его линейность<Foldable>.

Concrete models

<hana::tuple>,<hana::string>,<hana::range>

Variables

constexpr auto boost::hana::at
 Returns the nth element of an iterable.Given an Iterable and an IntegralConstant index, at returns the element located at the index in the linearization of the iterable. Specifically, given an iterable xs with a linearization of [x1, ..., xN], at(xs, k) is equivalent to xk. More...
 
template<std::size_t n>
constexpr auto boost::hana::at_c
 Equivalent to at; provided for convenience. More...
 
constexpr auto boost::hana::back
 Returns the last element of a non-empty and finite iterable.Given a non-empty and finite iterable xs with a linearization of [x1, ..., xN], back(xs) is equal to xN. Equivalently, back(xs) must be equivalent to at_c<N-1>(xs), and that regardless of the value category of xs (back must respect the reference semantics of at). More...
 
constexpr auto boost::hana::drop_front
 Drop the first n elements of an iterable, and return the rest.Given an Iterable xs with a linearization of [x1, x2, ...] and a non-negative IntegralConstant n, drop_front(xs, n) is an iterable with the same tag as xs whose linearization is [xn+1, xn+2, ...]. In particular, note that this function does not mutate the original iterable in any way. If n is not given, it defaults to an IntegralConstant with a value equal to 1. More...
 
constexpr auto boost::hana::drop_front_exactly
 Drop the first n elements of an iterable, and return the rest.Given an Iterable xs with a linearization of [x1, x2, ...] and a non-negative IntegralConstant n, drop_front_exactly(xs, n) is an iterable with the same tag as xs whose linearization is [xn+1, xn+2, ...]. In particular, note that this function does not mutate the original iterable in any way. If n is not given, it defaults to an IntegralConstant with a value equal to 1. More...
 
constexpr auto boost::hana::drop_while
 Drop elements from an iterable up to, but excluding, the first element for which the predicate is not satisfied.Specifically, drop_while returns an iterable containing all the elements of the original iterable except for those in the range delimited by [head, e), where head is the first element and e is the first element for which the predicate is not satisfied. If the iterable is not finite, the predicate has to return a false- valued Logical at a finite index for this method to return. More...
 
constexpr auto boost::hana::front
 Returns the first element of a non-empty iterable.Given a non-empty Iterable xs with a linearization of [x1, ..., xN], front(xs) is equal to x1. If xs is empty, it is an error to use this function. Equivalently, front(xs) must be equivalent to at_c<0>(xs), and that regardless of the value category of xs (front must respect the reference semantics of at). More...
 
constexpr auto boost::hana::is_empty
 Returns whether the iterable is empty.Given an Iterable xs, is_empty returns whether xs contains no more elements. In other words, it returns whether trying to extract the tail of xs would be an error. In the current version of the library, is_empty must return an IntegralConstant holding a value convertible to bool. This is because only compile-time Iterables are supported right now. More...
 
constexpr auto boost::hana::lexicographical_compare
 Short-circuiting lexicographical comparison of two Iterables with an optional custom predicate, by default hana::less.Given two Iterables xs and ys and a binary predicate pred, lexicographical_compare returns whether xs is to be considered less than ys in a lexicographical ordering. Specifically, let's denote the linearizations of xs and ys by [x1, x2, ...] and [y1, y2, ...], respectively. If the first couple satisfying the predicate is of the form xi, yi, lexicographical_compare returns true. Otherwise, if the first couple to satisfy the predicate is of the form yi, xi, lexicographical_compare returns false. If no such couple can be found, lexicographical_compare returns whether xs has fewer elements than ys. More...
 

Variable Documentation

constexpr auto boost::hana::at

<#include <boost/hana/fwd/at.hpp>>

Initial value:
= [](auto&& xs, auto const& n) -> decltype(auto) {
return tag-dispatched;
}

Возвращает<n>элемент итерации. Учитывая<Iterable>и<IntegralConstant>индекс,<at>возвращает элемент, расположенный в индексе, в линеаризации итерируемого. В частности, учитывая итерабельность<xs>с линеаризацией<[x1, ..., xN]>,<at(xs, k)>эквивалентен<xk>.

Если<Iterable>на самом деле хранит элементы, которые он содержит,<at>требуется вернуть ссылку на lvalue, ссылку на lvalue на const или ссылку на rvalue на соответствующий элемент, где тип ссылки должен соответствовать типу ссылки, передаваемой на<at>. Если<Iterable>не хранит элементы, которые он содержит (т.е. генерирует их по требованию), это требование отпадает.

Parameters
xsИтерация, в которой элемент извлекается. Он должен содержать не менее 92 элементов.
nНеотрицательный<IntegralConstant>, представляющий нулевой индекс элемента для возврата. Ошибочно называть<at>индексом, который выходит за пределы итерируемого.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
constexpr auto xs = hana::make_tuple(0, '1', 2.0);
static_assert(hana::at(xs, hana::size_c<0>) == 0, "");
static_assert(hana::at(xs, hana::size_c<1>) == '1', "");
static_assert(hana::at(xs, hana::size_c<2>) == 2.0, "");
int main() { }
template<std::size_t n>
constexpr auto boost::hana::at_c

<#include <boost/hana/fwd/at.hpp>>

Initial value:
= [](auto&& xs) {
return hana::at(forwarded(xs), hana::size_c<n>);
}
constexpr auto at
Returns the nth element of an iterable.Given an Iterable and an IntegralConstant index, at returns the element located at the index in the linearization of the iterable. Specifically, given an iterable xs with a linearization of [x1, ..., xN], at(xs, k) is equivalent to xk.
Definition: at.hpp:50

<at>Для удобства.

Note
hana::at_c<n> is an overloaded function, not a function object. Hence, it can't be passed to higher-order algorithms. This is done for compile-time performance reasons.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
constexpr auto xs = hana::make_tuple(0, '1', 2.0);
static_assert(hana::at_c<0>(xs) == 0, "");
static_assert(hana::at_c<1>(xs) == '1', "");
static_assert(hana::at_c<2>(xs) == 2.0, "");
int main() { }
constexpr auto boost::hana::back

<#include <boost/hana/fwd/back.hpp>>

Initial value:
= [](auto&& xs) -> decltype(auto) {
return tag-dispatched;
}

Возвращает последний элемент непустого и конечного итерабельного. При непустой и конечной итерации<xs>с линеаризацией<[x1, ..., xN]><back(xs)>равно<xN>. Эквивалентно<back(xs)>должно быть эквивалентно<at_c<N-1>(xs)>, и что независимо от ценностной категории<xs><back>должно соблюдать эталонную семантику<at>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
static_assert(hana::back(hana::make_tuple(1, '2', 3.3)) == 3.3, "");
static_assert(hana::back(hana::make_tuple(1, '2', 3.3, nullptr)) == nullptr, "");
int main() { }
constexpr auto boost::hana::drop_front

<#include <boost/hana/fwd/drop_front.hpp>>

Initial value:
= [](auto&& xs[, auto const& n]) {
return tag-dispatched;
}

Опустить первые 108 элементов и вернуть остальные.<Iterable><xs>с линеаризацией<[x1, x2, ...]>и неотрицательной<IntegralConstant><n>,<drop_front(xs, n)>является итерируемым с той же меткой, что и<xs>, линеаризация которого<[xn+1, xn+2, ...]>. В частности, обратите внимание, что эта функция никоим образом не мутирует исходный итерируемый. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.

В случае<length(xs) <= n>,<drop_front>просто отбросит весь итерируемый без отказа, таким образом возвращая пустой итерируемый. Это отличается от<drop_front_exactly>, который ожидает<n <= length(xs)>, но может быть лучше оптимизирован из-за этой дополнительной гарантии.

Parameters
xsИтерабельность, из которой выпадают элементы.
nНеотрицательный<IntegralConstant>, представляющий количество элементов, которые должны быть выброшены из итерабельного. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
constexpr auto xs = hana::make_tuple(0, '1', 2.0);
static_assert(hana::drop_front(xs, hana::size_c<0>) == xs, "");
static_assert(hana::drop_front(xs, hana::size_c<1>) == hana::make_tuple('1', 2.0), "");
static_assert(hana::drop_front(xs, hana::size_c<2>) == hana::make_tuple(2.0), "");
BOOST_HANA_CONSTANT_CHECK(hana::drop_front(xs, hana::size_c<3>) == hana::make_tuple());
BOOST_HANA_CONSTANT_CHECK(hana::drop_front(xs, hana::size_c<4>) == hana::make_tuple());
// drop_front(xs) is equivalent to drop_front(xs, size_t<1>)
static_assert(hana::drop_front(xs) == hana::make_tuple('1', 2.0), "");
int main() { }
constexpr auto boost::hana::drop_front_exactly

<#include <boost/hana/fwd/drop_front_exactly.hpp>>

Initial value:
= [](auto&& xs[, auto const& n]) {
return tag-dispatched;
}

Откажитесь от первых 129 элементов и верните остальные.<Iterable><xs>с линеаризацией<[x1, x2, ...]>и неотрицательным<IntegralConstant><n>,<drop_front_exactly(xs, n)>является итерируемым с той же меткой, что и<xs>, линеаризация которого<[xn+1, xn+2, ...]>. В частности, обратите внимание, что эта функция никоим образом не мутирует исходный итерируемый. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.

Ошибка в использовании<drop_front_exactly>с<n > length(xs)>. Эта дополнительная гарантия позволяет лучше оптимизировать<drop_front_exactly>, чем функция<drop_front>, которая позволяет<n > length(xs)>.

Parameters
xsИтерабельность, из которой выпадают элементы.
nНеотрицательный<IntegralConstant>, представляющий число элементов, которые должны быть выброшены из итерируемого. В дополнение к тому, чтобы быть неотрицательным,<n>должно быть меньше или равно количеству элементов в<xs>. Если<n>не дано, он по умолчанию<IntegralConstant>со значением, равным<1>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
constexpr auto xs = hana::make_tuple(0, '1', 2.0);
static_assert(hana::drop_front_exactly(xs, hana::size_c<1>) == hana::make_tuple('1', 2.0), "");
static_assert(hana::drop_front_exactly(xs, hana::size_c<2>) == hana::make_tuple(2.0), "");
BOOST_HANA_CONSTANT_CHECK(hana::drop_front_exactly(xs, hana::size_c<3>) == hana::make_tuple());
// drop_front_exactly(xs) is equivalent to drop_front_exactly(xs, size_t<1>)
static_assert(hana::drop_front_exactly(xs) == hana::make_tuple('1', 2.0), "");
int main() { }
constexpr auto boost::hana::drop_while

<#include <boost/hana/fwd/drop_while.hpp>>

Initial value:
= [](auto&& iterable, auto&& predicate) {
return tag-dispatched;
}

Отбрасывайте элементы от повторяемого до первого элемента, для которого<predicate>не удовлетворяется. В частности,<drop_while>возвращает итерируемый элемент, содержащий все элементы оригинального итерируемого, за исключением тех, которые находятся в диапазоне, ограниченном<head>,<e>, где<head>является первым элементом и<e>является первым элементом, для которого<predicate>не удовлетворяется. Если итерируемое не является конечным, то<predicate>должно вернуть ложное значение<Logical>при конечном индексе для возврата этого метода.

Parameters
iterableИтерабельность, из которой выпадают элементы.
predicateФункция, называемая<predicate(x)>, где<x>является элементом структуры, и возвращающая<Logical>, представляющая, следует ли<x>выбросить из структуры. В текущей версии библиотеки<predicate>должно вернуться время компиляции<Logical>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
using namespace hana::literals;
auto negative = [](auto x) {
return x < hana::int_c<0>;
};
hana::drop_while(hana::make_range(hana::int_c<-3>, hana::int_c<6>), negative)
==
hana::make_range(hana::int_c<0>, hana::int_c<6>)
);
hana::drop_while(hana::make_tuple(1_c, -2_c, 4_c, 5_c), negative)
==
hana::make_tuple(1_c, -2_c, 4_c, 5_c)
);
int main() { }
constexpr auto boost::hana::front

<#include <boost/hana/fwd/front.hpp>>

Initial value:
= [](auto&& xs) -> decltype(auto) {
return tag-dispatched;
}

Возвращает первый элемент непустого итерируемого. При непустом итерируемом<xs>с линеаризацией<[x1, ..., xN]>,<front(xs)>равно<x1>. Если<xs>пуст, то использовать эту функцию ошибочно. Равнозначно<front(xs)>должно быть эквивалентно<at_c<0>(xs)>, и что независимо от ценностной категории<xs><front>должно соблюдать эталонную семантику<at>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
static_assert(hana::front(hana::make_tuple(1, '2', 3.3, nullptr)) == 1, "");
int main() { }
constexpr auto boost::hana::is_empty

<#include <boost/hana/fwd/is_empty.hpp>>

Initial value:
= [](auto const& xs) {
return tag-dispatched;
}

Возвращает ли итерируемый пустой.<Iterable><xs>,<is_empty>возвращает<xs>не содержит больше элементов. Иными словами, он возвращает, будет ли попытка извлечь хвост<xs>ошибкой. В текущей версии библиотеки<is_empty>должно быть возвращено<IntegralConstant>значение, конвертируемое в<bool>. Это связано с тем, что сейчас поддерживается только время компиляции<Iterable>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
BOOST_HANA_CONSTANT_CHECK(!hana::is_empty(hana::make_tuple(1, '2')));
int main() { }
constexpr auto boost::hana::lexicographical_compare

<#include <boost/hana/fwd/lexicographical_compare.hpp>>

Initial value:
= [](auto const& xs, auto const& ys, auto const& pred = hana::less) {
return tag-dispatched;
}
constexpr auto less
Returns a Logical representing whether x is less than y.
Definition: less.hpp:37

Краткосрочное лексикографическое сравнение двух<Iterable>с необязательным пользовательским предикатом по умолчанию<hana::less>.Учитывая два<Iterable>с<xs>и<ys>и двоичный предикат<pred>,<lexicographical_compare>возвращает, следует ли<xs>считать менее<ys>в лексикографическом порядке. Конкретно, давайте обозначим линейности<xs>и<ys><[x1, x2, ...]>и<[y1, y2, ...]>соответственно. Если первая пара, удовлетворяющая предикату, имеет форму<xi, yi>,<lexicographical_compare>возвращается истинной. В противном случае, если первая пара, удовлетворяющая предикату, имеет форму<yi, xi>,<lexicographical_compare>возвращается ложной. Если такой пары нет,<lexicographical_compare>возвращает<xs>меньше элементов, чем<ys>.

Note
This algorithm will short-circuit as soon as it can determine that one sequence is lexicographically less than the other. Hence, it can be used to compare infinite sequences. However, for the procedure to terminate on infinite sequences, the predicate has to be satisfied at a finite index.

Signature

При наличии двух<Iterable>s<It1(T)>и<It2(T)>и предиката \(предварительно: T \times T \to Bool \) (где<Bool>является неким<Logical>),<lexicographical_compare>имеет следующие подписи. Для варианта с заданным предикатом,

\[ \mathtt{lexicographical\_compare} : It1(T) \times It2(T) \times (T \times T \to Bool) \to Bool \]

Для варианта без обычного предиката<T>требуется<Orderable>. Подпись тогда

\[ \mathtt{lexicographical\_compare} : It1(T) \times It2(T) \to Bool \]

Parameters
xs,ysДва<Iterable>для сравнения лексикографически.
predБинарная функция называется<pred(x, y)>и<pred(y, x)>, где<x>и<y>являются элементами<xs>и<ys>соответственно.<pred>должен вернуть<Logical>, представляя, следует ли считать его первый аргумент меньшим, чем его второй аргумент. Также обратите внимание, что<pred>должен определять общую упорядоченность, как определено концепцией<Orderable>. Когда<pred>не предусмотрено, он по умолчанию<less>.

Example

// Copyright Louis Dionne 2013-2016
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
namespace hana = boost::hana;
int main() {
// works with elements whose `less` does not return a Constant
{
constexpr auto xs = hana::make_tuple(1, 2, 3, 4);
constexpr auto ys = hana::make_tuple(1, 6, 3, 4);
static_assert(hana::lexicographical_compare(xs, ys), "");
}
// and with those that do
{
auto xs = hana::make_tuple(hana::int_c<1>, hana::int_c<2>, hana::int_c<3>);
auto ys = hana::make_tuple(hana::int_c<1>, hana::int_c<5>, hana::int_c<3>);
}
// it also accepts a custom predicate
{
auto xs = hana::make_tuple(hana::type_c<int>, hana::type_c<char>, hana::type_c<void*>);
auto ys = hana::make_tuple(hana::type_c<int>, hana::type_c<long>, hana::type_c<void*>);
hana::lexicographical_compare(xs, ys, [](auto t, auto u) {
return hana::sizeof_(t) < hana::sizeof_(u);
})
);
}
}

Ссылка наboost::hana::literals::operator""_s().

Статья Boost.Hana: Iterable раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:22:12/0.0080950260162354/0