Partilhar via


<cliext/adapter> (STL/CLR)

O cabeçalho <cliext/adapter> STL/CLR especifica dois modelos de classe (collection_adapter e range_adapter) e o modelo de make_collectionfunção .

Sintaxe

#include <cliext/adapter>

Requisitos

Cabeçalho:<cliext/adaptador>

Namespace: cliext

Declarações

Classe Descrição
collection_adapter Encapsula a coleção BCL (Biblioteca de Classes Base) como um intervalo.
range_adapter Encapsula o intervalo como uma coleção BCL.
Função Descrição
make_collection Cria um adaptador de intervalo usando um par de iteradores.

Membros

collection_adapter

Encapsula uma coleção .NET para uso como um contêiner STL/CLR. Um collection_adapter é uma classe de modelo que descreve um objeto de contêiner STL/CLR simples. Ele encapsula uma interface de BCL (Biblioteca de Classes Base) e retorna um par de iteradores que você usa para manipular a sequência controlada.

Sintaxe

template<typename Coll>
    ref class collection_adapter;

template<>
    ref class collection_adapter<
        System::Collections::ICollection>;
template<>
    ref class collection_adapter<
        System::Collections::IEnumerable>;
template<>
    ref class collection_adapter<
        System::Collections::IList>;
template<>
    ref class collection_adapter<
        System::Collections::IDictionary>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::ICollection<Value>>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IEnumerable<Value>>;
template<typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IList<Value>>;
template<typename Key,
    typename Value>
    ref class collection_adapter<
        System::Collections::Generic::IDictionary<Key, Value>>;

Parâmetros

Coll
O tipo da coleção encapsulada.

Especializações

carga de trabalho Descrição
IEnumerable Sequencia por meio de elementos.
ICollection Mantém um grupo de elementos.
IList Mantém um grupo ordenado de elementos.
IDictionary Mantenha um conjunto de pares {key, value}.
IEnumerable<Value> Sequencia por meio de elementos tipados.
ICollection<Value> Mantém um grupo de elementos tipados.
IList<Value> Mantém um grupo ordenado de elementos tipados.
IDictionary<Value> Mantém um conjunto de pares {key, value} tipados.

Membros

Definição do tipo Descrição
collection_adapter::difference_type O tipo de uma distância com sinal entre dois elementos.
collection_adapter::iterator O tipo de um iterador para a sequência controlada.
collection_adapter::key_type O tipo de uma chave de dicionário.
collection_adapter::mapped_type O tipo de um valor de dicionário.
collection_adapter::reference O tipo de uma referência para um elemento.
collection_adapter::size_type O tipo de uma distância com sinal entre dois elementos.
collection_adapter::value_type O tipo de um elemento.
Função de membro Descrição
collection_adapter::base Designa a interface BCL encapsulada.
collection_adapter::begin Designa o início da sequência controlada.
collection_adapter::collection_adapter Constrói um objeto adaptador.
collection_adapter::end Designa o fim da sequência controlada.
collection_adapter::size Conta o número de elementos.
collection_adapter::swap Alterna o conteúdo de dois contêineres.
Operador Descrição
collection_adapter::operator= Substitui o identificador BCL armazenado.

Comentários

Você usa essa classe de modelo para manipular um contêiner de BCL como um contêiner STL/CLR. O collection_adapter armazena um identificador em uma interface BCL, que, por sua vez, controla uma sequência de elementos. Um objeto collection_adapter X retorna um par de iteradores de entrada X.begin() e X.end() que você usa para visitar os elementos, em ordem. Algumas das especializações também permitem que você escreva X.size() para determinar o comprimento da sequência controlada.

collection_adapter::base

Designa a interface BCL encapsulada.

Sintaxe

Coll^ base();

Comentários

A função membro retorna o identificador de interface BCL armazenado.

Exemplo

// cliext_collection_adapter_base.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
    {
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    System::Console::WriteLine("base() same = {0}", c1.base() == %c1);
    return (0);
    }
x x x x x x
base() same = True

collection_adapter::begin

Designa o início da sequência controlada.

Sintaxe

iterator begin();

Comentários

A função de membro retorna um iterador de entrada que designa o primeiro elemento da sequência controlada ou logo após o final de uma sequência vazia.

Exemplo

// cliext_collection_adapter_begin.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // inspect first two items
    Mycoll::iterator it = c1.begin();
    System::Console::WriteLine("*begin() = {0}", *it);
    System::Console::WriteLine("*++begin() = {0}", *++it);
    return (0);
}
a b c
*begin() = a
*++begin() = b

collection_adapter::collection_adapter

Constrói um objeto adaptador.

Sintaxe

collection_adapter();
collection_adapter(collection_adapter<Coll>% right);
collection_adapter(collection_adapter<Coll>^ right);
collection_adapter(Coll^ collection);

Parâmetros

collection
Identificador BCL para encapsular.

right
Objeto a ser copiado.

Comentários

O construtor:

collection_adapter();

inicializa o identificador armazenado com nullptr.

O construtor:

collection_adapter(collection_adapter<Coll>% right);

inicializa o identificador armazenado com right.base().

O construtor:

collection_adapter(collection_adapter<Coll>^ right);

inicializa o identificador armazenado com right->base().

O construtor:

collection_adapter(Coll^ collection);

inicializa o identificador armazenado com collection.

Exemplo

// cliext_collection_adapter_construct.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');

    // construct an empty container
    Mycoll c1;
    System::Console::WriteLine("base() null = {0}", c1.base() == nullptr);

    // construct with a handle
    Mycoll c2(%d6x);
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying another container
    Mycoll c3(c2);
    for each (wchar_t elem in c3)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying a container handle
    Mycoll c4(%c3);
    for each (wchar_t elem in c4)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
base() null = True
x x x x x x
x x x x x x
x x x x x x

collection_adapter::difference_type

Os tipos de uma distância com sinal entre dois elementos.

Sintaxe

typedef int difference_type;

Comentários

O tipo descreve uma contagem de elementos com sinal.

Exemplo

// cliext_collection_adapter_difference_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // compute positive difference
    Mycoll::difference_type diff = 0;
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        ++diff;
    System::Console::WriteLine("end()-begin() = {0}", diff);
    return (0);
}
a b c
end()-begin() = 3

collection_adapter::end

Designa o fim da sequência controlada.

Sintaxe

iterator end();

Comentários

A função de membro retorna um iterador de entrada que aponta para logo após o fim da sequência controlada.

Exemplo

// cliext_collection_adapter_end.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        System::Console::Write("{0} ", *it);
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::iterator

O tipo de um iterador para a sequência controlada.

Sintaxe

typedef T1 iterator;

Comentários

O tipo descreve um objeto de tipo não especificado T1 que pode servir como um iterador de entrada para a sequência controlada.

Exemplo

// cliext_collection_adapter_iterator.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
        System::Console::Write("{0} ", *it);
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::key_type

O tipo de uma chave de dicionário.

Sintaxe

typedef Key key_type;

Comentários

O tipo é um sinônimo para o parâmetro Keyde modelo , em uma especialização para IDictionary ou IDictionary<Value>; caso contrário, ele não será definido.

Exemplo

// cliext_collection_adapter_key_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/map>

typedef cliext::map<wchar_t, int> Mymap;
typedef cliext::collection_adapter<
    System::Collections::Generic::IDictionary<wchar_t, int>> Mycoll;
typedef System::Collections::Generic::KeyValuePair<wchar_t,int> Mypair;
int main()
{
    Mymap d1;
    d1.insert(Mymap::make_value(L'a', 1));
    d1.insert(Mymap::make_value(L'b', 2));
    d1.insert(Mymap::make_value(L'c', 3));
    Mycoll c1(%d1);

    // display contents "[a 1] [b 2] [c 3] "
    for each (Mypair elem in c1)
    {
        Mycoll::key_type key = elem.Key;
        Mycoll::mapped_type value = elem.Value;
        System::Console::Write("[{0} {1}] ", key, value);
    }
    System::Console::WriteLine();
    return (0);
}
[a 1] [b 2] [c 3]

collection_adapter::mapped_type

O tipo de um valor de dicionário.

Sintaxe

typedef Value mapped_type;

Comentários

O tipo é um sinônimo para o parâmetro Valuede modelo , em uma especialização para IDictionary ou IDictionary<Value>; caso contrário, ele não será definido.

Exemplo

// cliext_collection_adapter_mapped_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/map>

typedef cliext::map<wchar_t, int> Mymap;
typedef cliext::collection_adapter<
    System::Collections::Generic::IDictionary<wchar_t, int>> Mycoll;
typedef System::Collections::Generic::KeyValuePair<wchar_t,int> Mypair;
int main()
{
    Mymap d1;
    d1.insert(Mymap::make_value(L'a', 1));
    d1.insert(Mymap::make_value(L'b', 2));
    d1.insert(Mymap::make_value(L'c', 3));
    Mycoll c1(%d1);

    // display contents "[a 1] [b 2] [c 3] "
    for each (Mypair elem in c1)
    {
        Mycoll::key_type key = elem.Key;
        Mycoll::mapped_type value = elem.Value;
        System::Console::Write("[{0} {1}] ", key, value);
    }
    System::Console::WriteLine();
    return (0);
}
[a 1] [b 2] [c 3]

collection_adapter::operator=

Substitui o identificador BCL armazenado.

Sintaxe

collection_adapter<Coll>% operator=(collection_adapter<Coll>% right);

Parâmetros

right
Adaptador a ser copiado.

Comentários

O operador membro copia right para o objeto e retorna *this. Você o usa para substituir o identificador BCL armazenado por uma cópia do identificador BCL armazenado no right.

Exemplo

// cliext_collection_adapter_operator_as.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // assign to a new container
    Mycoll c2;
    c2 = c1;
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
a b c

collection_adapter::reference

O tipo de uma referência para um elemento.

Sintaxe

typedef value_type% reference;

Comentários

O tipo descreve uma referência a um elemento.

Exemplo

// cliext_collection_adapter_reference.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
    {
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents "a b c "
    Mycoll::iterator it = c1.begin();
    for (; it != c1.end(); ++it)
    {   // get a reference to an element
        Mycoll::reference ref = *it;
        System::Console::Write("{0} ", ref);
    }
    System::Console::WriteLine();
    return (0);
}
a b c

collection_adapter::size

Conta o número de elementos.

Sintaxe

size_type size();

Comentários

A função membro retorna o comprimento da sequência controlada. Ele não é definido em uma especialização para IEnumerable ou IEnumerable<Value>.

Exemplo

// cliext_collection_adapter_size.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x "
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    System::Console::WriteLine("size() = {0}", c1.size());
    return (0);
}
x x x x x x
size() = 6

collection_adapter::size_type

O tipo de uma distância com sinal entre dois elementos.

Sintaxe

typedef int size_type;

Comentários

O tipo descreve uma contagem de elementos não negativos.

Exemplo

// cliext_collection_adapter_size_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d6x(6, L'x');
    Mycoll c1(%d6x);

    // display initial contents "x x x x x x"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    Mycoll::size_type size = c1.size();
    System::Console::WriteLine("size() = {0}", size);
    return (0);
}
x x x x x x
size() = 6

collection_adapter::swap

Alterna o conteúdo de dois contêineres.

Sintaxe

void swap(collection_adapter<Coll>% right);

Parâmetros

right
Contêiner com o qual trocar conteúdos.

Comentários

A função membro troca os identificadores BCL armazenados entre *this e right.

Exemplo

// cliext_collection_adapter_swap.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display initial contents " a b c"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct another container with repetition of values
    cliext::deque<wchar_t> d2(5, L'x');
    Mycoll c2(%d2);
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // swap and redisplay
    c1.swap(c2);
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
x x x x x
x x x x x
a b c

collection_adapter::value_type

O tipo de um elemento.

Sintaxe

typedef Value value_type;

Comentários

O tipo é um sinônimo para o parâmetro Valuede modelo , se presente na especialização; caso contrário, é um sinônimo de System::Object^.

Exemplo

// cliext_collection_adapter_value_type.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::collection_adapter<
    System::Collections::ICollection> Mycoll;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Mycoll c1(%d1);

    // display contents "a b c" using value_type
    for (Mycoll::iterator it = c1.begin();
        it != c1.end(); ++it)
    {   // store element in value_type object
        Mycoll::value_type val = *it;

        System::Console::Write("{0} ", val);
    }
    System::Console::WriteLine();
    return (0);
}
a b c

make_collection (STL/CLR)

Crie um range_adapter com base em um par de iteradores.

Sintaxe

template<typename Iter>
    range_adapter<Iter> make_collection(Iter first, Iter last);

Parâmetros

Iter
O tipo dos iteradores encapsulados.

first
Primeiro iterador a ser encapsulado.

last
Segundo iterador a ser encapsulado.

Comentários

O modelo de função retorna gcnew range_adapter<Iter>(first, last). Use-o para construir um objeto range_adapter<Iter> a partir de um par de iteradores.

Exemplo

// cliext_make_collection.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');

    // display contents " a b c"
    for each (wchar_t elem in d1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    System::Collections::ICollection^ p1 =
        cliext::make_collection(d1.begin(), d1.end());
    System::Console::WriteLine("Count = {0}", p1->Count);
    System::Console::WriteLine("IsSynchronized = {0}",
        p1->IsSynchronized);
    System::Console::WriteLine("SyncRoot not nullptr = {0}",
        p1->SyncRoot != nullptr);

    // copy the sequence
    cli::array<System::Object^>^ a1 = gcnew cli::array<System::Object^>(5);

    a1[0] = L'|';
    p1->CopyTo(a1, 1);
    a1[4] = L'|';
    for each (wchar_t elem in a1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
a b c
Count = 3
IsSynchronized = False
SyncRoot not nullptr = True
| a b c |

range_adapter (STL/CLR)

Uma classe de modelo que encapsula um par de iteradores que são usados para implementar várias interfaces BCL (Biblioteca de Classes Base). Você usa o range_adapter para manipular um intervalo STL/CLR como se fosse uma coleção BCL.

Sintaxe

template<typename Iter>
    ref class range_adapter
        :   public
        System::Collections::IEnumerable,
        System::Collections::ICollection,
        System::Collections::Generic::IEnumerable<Value>,
        System::Collections::Generic::ICollection<Value>
    { ..... };

Parâmetros

Iter
O tipo associado aos iteradores encapsulados.

Membros

Função de membro Descrição
range_adapter::range_adapter Constrói um objeto adaptador.
Operador Descrição
range_adapter::operator= Substitui o par de iteradores armazenado.

Interfaces

Interface Descrição
IEnumerable Itera por meio de elementos na coleção.
ICollection Mantém um grupo de elementos.
IEnumerable<T> Itera por meio de elementos tipados na coleção.
ICollection<T> Mantém um grupo de elementos tipados.

Comentários

O range_adapter armazena um par de iteradores, que, por sua vez, delimitam uma sequência de elementos. O objeto implementa quatro interfaces BCL que permitem iterar por meio dos elementos, em ordem. Você usa essa classe de modelo para manipular intervalos STL/CLR muito parecidos com contêineres BCL.

range_adapter::operator=

Substitui o par de iteradores armazenado.

Sintaxe

range_adapter<Iter>% operator=(range_adapter<Iter>% right);

Parâmetros

right
Adaptador a ser copiado.

Comentários

O operador membro copia right para o objeto e retorna *this. Você o usa para substituir o par de iteradores armazenado por uma cópia do par de iteradores armazenado no right.

Exemplo

// cliext_range_adapter_operator_as.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');
    Myrange c1(d1.begin(), d1.end());

    // display contents " a b c"
    for each (wchar_t elem in c1)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // assign to a new container
    Myrange c2;
    c2 = c1;
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();
    return (0);
}
a b c
a b c

range_adapter::range_adapter

Constrói um objeto adaptador.

Sintaxe

range_adapter();
range_adapter(range_adapter<Iter>% right);
range_adapter(range_adapter<Iter>^ right);
range_adapter(Iter first, Iter last);

Parâmetros

first
Primeiro iterador a ser encapsulado.

last
Segundo iterador a ser encapsulado.

right
Objeto a ser copiado.

Comentários

O construtor:

range_adapter();

inicializa o par de iteradores armazenados com iteradores construídos padrão.

O construtor:

range_adapter(range_adapter<Iter>% right);

inicializa o par de iteradores armazenado copiando o par armazenado right.

O construtor:

range_adapter(range_adapter<Iter>^ right);

inicializa o par de iteradores armazenado copiando o par armazenado *right.

O construtor:

range_adapter(Iter^ first, last);

inicializa o par de iteradores armazenado com first e last.

Exemplo

// cliext_range_adapter_construct.cpp
// compile with: /clr
#include <cliext/adapter>
#include <cliext/deque>

typedef cliext::deque<wchar_t> Mycont;
typedef cliext::range_adapter<Mycont::iterator> Myrange;
int main()
{
    cliext::deque<wchar_t> d1;
    d1.push_back(L'a');
    d1.push_back(L'b');
    d1.push_back(L'c');

    // construct an empty adapter
    Myrange c1;

    // construct with an iterator pair
    Myrange c2(d1.begin(), d1.end());
    for each (wchar_t elem in c2)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying another adapter
    Myrange c3(c2);
    for each (wchar_t elem in c3)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    // construct by copying an adapter handle
    Myrange c4(%c3);
    for each (wchar_t elem in c4)
        System::Console::Write("{0} ", elem);
    System::Console::WriteLine();

    return (0);
}
a b c
a b c
a b c