// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/GccAttribute.java
// public final class GccAttribute<N extends Enum<N> & AttributeName> implements Writable
// {
// 	@NotNull private final N name;
// 	@NotNull private final GccAttributeParameter[] gccAttributeParameters;
// 
// 	public GccAttribute(@NotNull final N name, @NotNull GccAttributeParameter... gccAttributeParameters)
// 	{
// 		this.name = name;
// 		this.gccAttributeParameters = gccAttributeParameters;
// 	}
// 
// 	public void write(@NotNull final Writer writer) throws IOException
// 	{
// 		writer.write(name.name());
// 		if (gccAttributeParameters.length != 0)
// 		{
// 			writer.write(" (");
// 			boolean afterFirst = false;
// 			for (GccAttributeParameter gccAttributeParameter : gccAttributeParameters)
// 			{
// 				if (afterFirst)
// 				{
// 					writer.write(", ");
// 				}
// 				else
// 				{
// 					afterFirst = true;
// 				}
// 				gccAttributeParameter.write(writer);
// 			}
// 			writer.write(')');
// 		}
// 	}
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/variable/GccVariableAttributeName.java
// public enum GccVariableAttributeName implements AttributeName
// {
// 	aligned,
// 	cleanup,
// 	common,
// 	nocommon,
// 	deprecated,
// 	mode,
// 	packed,
// 	section,
// 	tls_model,
// 	unused,
// 	used,
// 	vector_size,
// 	weak,
// 	;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/FieldAttributesProcessor.java
// public interface FieldAttributesProcessor
// {
// 	void processField(@NotNull final Collection<GccAttribute<GccVariableAttributeName>> gccAttributes, @NotNull final VariableElement field) throws ConversionException;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/AlignmentFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Alignment = new AlignmentFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/DeprecatedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Deprecated = new DeprecatedFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/NullCheckFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor NullCheck = new NullCheckFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/PackedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Packed = new PackedFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/SectionFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Section = new SectionFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/ThreadLocalModelFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor ThreadLocalModel = new ThreadLocalModelFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/UnusedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Unused = new UnusedFieldAttributesProcessor();


import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.GccAttribute;
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.variable.GccVariableAttributeName;
import com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.FieldAttributesProcessor;
import org.jetbrains.annotations.NotNull;
import javax.lang.model.element.VariableElement;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.AlignmentFieldAttributesProcessor.Alignment;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.DeprecatedFieldAttributesProcessor.Deprecated;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.NullCheckFieldAttributesProcessor.NullCheck;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.PackedFieldAttributesProcessor.Packed;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.SectionFieldAttributesProcessor.Section;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.ThreadLocalModelFieldAttributesProcessor.ThreadLocalModel;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.UnusedFieldAttributesProcessor.Unused;
import static java.util.Arrays.asList;
package com.stormmq.java2c.transpiler.conversion.elementConverters;




public final class FieldAttributesProcessors
{
	@NotNull public static final FieldAttributesProcessors StaticFieldAttributesProcessors = new FieldAttributesProcessors
	(
		NullCheck,
		Deprecated,
		Unused,
		Alignment,
		ThreadLocalModel,
		Section,
		Packed
	);

	@NotNull public static final FieldAttributesProcessors InstanceFieldAttributesProcessors = StaticFieldAttributesProcessors;

	@NotNull private final Set<FieldAttributesProcessor> fieldAttributesProcessors;

	public FieldAttributesProcessors(@NotNull final FieldAttributesProcessor... fieldAttributesProcessors)
	{
		this.fieldAttributesProcessors = new LinkedHashSet<>(asList(fieldAttributesProcessors));
	}

	@NotNull
	public List<GccAttribute<GccVariableAttributeName>> processFieldAttributes(@NotNull final VariableElement field) throws ConversionException
	{
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/GccAttribute.java
// public final class GccAttribute<N extends Enum<N> & AttributeName> implements Writable
// {
// 	@NotNull private final N name;
// 	@NotNull private final GccAttributeParameter[] gccAttributeParameters;
// 
// 	public GccAttribute(@NotNull final N name, @NotNull GccAttributeParameter... gccAttributeParameters)
// 	{
// 		this.name = name;
// 		this.gccAttributeParameters = gccAttributeParameters;
// 	}
// 
// 	public void write(@NotNull final Writer writer) throws IOException
// 	{
// 		writer.write(name.name());
// 		if (gccAttributeParameters.length != 0)
// 		{
// 			writer.write(" (");
// 			boolean afterFirst = false;
// 			for (GccAttributeParameter gccAttributeParameter : gccAttributeParameters)
// 			{
// 				if (afterFirst)
// 				{
// 					writer.write(", ");
// 				}
// 				else
// 				{
// 					afterFirst = true;
// 				}
// 				gccAttributeParameter.write(writer);
// 			}
// 			writer.write(')');
// 		}
// 	}
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/c/gccAttributes/variable/GccVariableAttributeName.java
// public enum GccVariableAttributeName implements AttributeName
// {
// 	aligned,
// 	cleanup,
// 	common,
// 	nocommon,
// 	deprecated,
// 	mode,
// 	packed,
// 	section,
// 	tls_model,
// 	unused,
// 	used,
// 	vector_size,
// 	weak,
// 	;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/FieldAttributesProcessor.java
// public interface FieldAttributesProcessor
// {
// 	void processField(@NotNull final Collection<GccAttribute<GccVariableAttributeName>> gccAttributes, @NotNull final VariableElement field) throws ConversionException;
// }
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/AlignmentFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Alignment = new AlignmentFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/DeprecatedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Deprecated = new DeprecatedFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/NullCheckFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor NullCheck = new NullCheckFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/PackedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Packed = new PackedFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/SectionFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Section = new SectionFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/ThreadLocalModelFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor ThreadLocalModel = new ThreadLocalModelFieldAttributesProcessor();
// 
// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/fieldAttributesProcessors/UnusedFieldAttributesProcessor.java
// @NotNull public static final FieldAttributesProcessor Unused = new UnusedFieldAttributesProcessor();


// Path: source/transpiler/com/stormmq/java2c/transpiler/conversion/elementConverters/FieldAttributesProcessors.java
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.GccAttribute;
import com.stormmq.java2c.transpiler.conversion.c.gccAttributes.variable.GccVariableAttributeName;
import com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.FieldAttributesProcessor;
import org.jetbrains.annotations.NotNull;
import javax.lang.model.element.VariableElement;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.AlignmentFieldAttributesProcessor.Alignment;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.DeprecatedFieldAttributesProcessor.Deprecated;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.NullCheckFieldAttributesProcessor.NullCheck;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.PackedFieldAttributesProcessor.Packed;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.SectionFieldAttributesProcessor.Section;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.ThreadLocalModelFieldAttributesProcessor.ThreadLocalModel;
import static com.stormmq.java2c.transpiler.conversion.elementConverters.fieldAttributesProcessors.UnusedFieldAttributesProcessor.Unused;
import static java.util.Arrays.asList;

package com.stormmq.java2c.transpiler.conversion.elementConverters;




public final class FieldAttributesProcessors
{
	@NotNull public static final FieldAttributesProcessors StaticFieldAttributesProcessors = new FieldAttributesProcessors
	(
		NullCheck,
		Deprecated,
		Unused,
		Alignment,
		ThreadLocalModel,
		Section,
		Packed
	);

	@NotNull public static final FieldAttributesProcessors InstanceFieldAttributesProcessors = StaticFieldAttributesProcessors;

	@NotNull private final Set<FieldAttributesProcessor> fieldAttributesProcessors;

	public FieldAttributesProcessors(@NotNull final FieldAttributesProcessor... fieldAttributesProcessors)
	{
		this.fieldAttributesProcessors = new LinkedHashSet<>(asList(fieldAttributesProcessors));
	}

	@NotNull
	public List<GccAttribute<GccVariableAttributeName>> processFieldAttributes(@NotNull final VariableElement field) throws ConversionException
	{
		final List<GccAttribute<GccVariableAttributeName>> gccAttributes = new ArrayList<>(4);