You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							64 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							64 lines
						
					
					
						
							2.1 KiB
						
					
					
				
								/*
							 | 
						|
								 * This is component of StoRM - Cuda Plugin to check whether type alignment matches the assumptions done while optimizing the code.
							 | 
						|
								 */
							 | 
						|
								 #include <cstdint>
							 | 
						|
								 #include <utility>
							 | 
						|
								 #include <vector>
							 | 
						|
								 
							 | 
						|
								 #define CONTAINER_SIZE 100ul
							 | 
						|
								 
							 | 
						|
								 template <typename IndexType, typename ValueType>
							 | 
						|
								 int checkForAlignmentOfPairTypes(size_t containerSize, IndexType const firstValue, ValueType const secondValue) {
							 | 
						|
									std::vector<std::pair<IndexType, ValueType>>* myVector = new std::vector<std::pair<IndexType, ValueType>>();
							 | 
						|
									for (size_t i = 0; i < containerSize; ++i) {
							 | 
						|
										myVector->push_back(std::make_pair(firstValue, secondValue));
							 | 
						|
									}
							 | 
						|
									size_t myVectorSize = myVector->size();
							 | 
						|
									IndexType* firstStart = &(myVector->at(0).first);
							 | 
						|
									IndexType* firstEnd = &(myVector->at(myVectorSize - 1).first);
							 | 
						|
									ValueType* secondStart = &(myVector->at(0).second);
							 | 
						|
									ValueType* secondEnd = &(myVector->at(myVectorSize - 1).second);
							 | 
						|
									size_t startOffset = reinterpret_cast<size_t>(secondStart) - reinterpret_cast<size_t>(firstStart);
							 | 
						|
									size_t endOffset = reinterpret_cast<size_t>(secondEnd) - reinterpret_cast<size_t>(firstEnd);
							 | 
						|
									size_t firstOffset = reinterpret_cast<size_t>(firstEnd) - reinterpret_cast<size_t>(firstStart);
							 | 
						|
									size_t secondOffset = reinterpret_cast<size_t>(secondEnd) - reinterpret_cast<size_t>(secondStart);
							 | 
						|
									
							 | 
						|
									delete myVector;
							 | 
						|
									myVector = nullptr;
							 | 
						|
									
							 | 
						|
									if (myVectorSize != containerSize) {
							 | 
						|
										return -2;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									// Check for alignment:
							 | 
						|
									// Requirement is that the pairs are aligned like: first, second, first, second, first, second, ...
							 | 
						|
									if (sizeof(IndexType) != sizeof(ValueType)) {
							 | 
						|
										return -3;
							 | 
						|
									}
							 | 
						|
									if (startOffset != sizeof(IndexType)) {
							 | 
						|
										return -4;
							 | 
						|
									}
							 | 
						|
									if (endOffset != sizeof(IndexType)) {
							 | 
						|
										return -5;
							 | 
						|
									}
							 | 
						|
									if (firstOffset != ((sizeof(IndexType) + sizeof(ValueType)) * (myVectorSize - 1))) {
							 | 
						|
										return -6;
							 | 
						|
									}
							 | 
						|
									if (secondOffset != ((sizeof(IndexType) + sizeof(ValueType)) * (myVectorSize - 1))) {
							 | 
						|
										return -7;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									return 0;
							 | 
						|
								 }
							 | 
						|
								 
							 | 
						|
								 
							 | 
						|
								 int main(int argc, char* argv[]) {
							 | 
						|
									int result = 0;
							 | 
						|
									
							 | 
						|
									result = checkForAlignmentOfPairTypes<uint_fast64_t, double>(CONTAINER_SIZE, 42, 3.14);
							 | 
						|
									if (result != 0) {
							 | 
						|
										return result;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									return 0;
							 | 
						|
								 }
							 |