1 /*
2  * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
3  *                         University Research and Technology
4  *                         Corporation.  All rights reserved.
5  * Copyright (c) 2004-2005 The University of Tennessee and The University
6  *                         of Tennessee Research Foundation.  All rights
7  *                         reserved.
8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9  *                         University of Stuttgart.  All rights reserved.
10  * Copyright (c) 2004-2005 The Regents of the University of California.
11  *                         All rights reserved.
12  * Copyright (c) 2015      Los Alamos National Security, LLC. All rights
13  *                         reserved.
14  * $COPYRIGHT$
15  *
16  * Additional copyrights may follow
17  *
18  * $HEADER$
19  */
20 
21 package mpi;
22 
23 /**
24  * Struct class for {@link MPI#INT2} datatype.
25  */
26 public final class Int2 extends Struct
27 {
28 	private final int iOff, iSize;
29 
30 	/**
31 	 * The struct object will be created only in MPI class.
32 	 * @param intOff	int offset
33 	 * @param intSize	int size
34 	 * @see MPI#int2
35 	 */
Int2(int intOff, int intSize)36 	protected Int2(int intOff, int intSize)
37 	{
38 		iSize = intSize;
39 		int off = addIntField();
40 		assert off == 0;
41 		setOffset(intOff);
42 		iOff = addIntField();
43 		assert intOff == iOff;
44 	}
45 
addIntField()46 	private int addIntField()
47 	{
48 		switch(iSize)
49 		{
50 		case 4: return addInt();
51 		case 8: return addLong();
52 		default: throw new AssertionError("Unsupported int size: "+ iSize);
53 		}
54 	}
55 
56 	/**
57 	 * Creates a Data object.
58 	 * @return new Data object.
59 	 */
newData()60 	@Override protected Int2.Data newData()
61 	{
62 		return new Int2.Data();
63 	}
64 
65 	/**
66 	 * Class for reading/writing data in a struct stored in a byte buffer.
67 	 */
68 	public final class Data extends Struct.Data
69 	{
70 		/**
71 		 * Gets the first int.
72 		 * @return first int
73 		 */
getValue()74 		public int getValue()
75 		{
76 			return get(0);
77 		}
78 
79 		/**
80 		 * Gets the second int.
81 		 * @return second int
82 		 */
getIndex()83 		public int getIndex()
84 		{
85 			return get(iOff);
86 		}
87 
88 		/**
89 		 * Puts the first int.
90 		 * @param v first value
91 		 */
putValue(int v)92 		public void putValue(int v)
93 		{
94 			put(0, v);
95 		}
96 
97 		/**
98 		 * Puts the second int.
99 		 * @param v second int
100 		 */
putIndex(int v)101 		public void putIndex(int v)
102 		{
103 			put(iOff, v);
104 		}
105 
get(int off)106 		private int get(int off)
107 		{
108 			switch(iSize)
109 			{
110 			case 4: return getInt(off);
111 			case 8: return (int)getLong(off);
112 			default: throw new AssertionError();
113 			}
114 		}
115 
put(int off, int v)116 		private void put(int off, int v)
117 		{
118 			switch(iSize)
119 			{
120 			case 4: putInt(off, v);  break;
121 			case 8: putLong(off, v); break;
122 			default: throw new AssertionError();
123 			}
124 		}
125 	} // Data
126 
127 } // Int2
128