added preprocessor double inclusion guards