// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
Ignite is available for Java, .NET/C#, {cpp} and other programming languages. The Java version provides the richest API.
The .NET/C#, C++, Python, etc. languages may have limited functionality. To make the Ignite documentation intuitive for all application developers,
we adhere to the following conventions:

* The information provided in this documentation applies to all programming languages unless noted otherwise.
* Code samples for different languages are provided in different tabs as shown below. For example, if you are a .NET developer, click on the .NET tab in the code examples to see .NET specific code.
+
[tabs]
--
tab:XML[]
[source,text]
----
This is a place where an example of XML configuration is provided.
Click on other tabs to view an equivalent programmatic configuration.
----
tab:Java[]
[source,text]
----
Code sample in Java. Click on other tabs to view the same example in other languages.
----
tab:C#/.NET[]
[source,text]
----
Code sample in .NET. Click on other tabs to view the same example in other languages.
----
tab:C++[]
[source,text]
----
Code sample in C++. Click on other tabs to view the same example in other languages.
----
--

* If there is no tab for a specific language, this most likely means that the functionality is not supported in that language.
